不要memset(QString)

目的

c语言当中习惯用sizeof获取变量大小,然后,根据这个大小memset一下这个变量。
但在c++语言当中再次使用就要注意了。
我就在项目中这样用,结果报错了,细查才找问题是这个原因,特此记一下,以分享给大家。

情况

下面就做一个例子,说明一下这个情况:
代码如下:

#include <QtCore/QCoreApplication>
#include <QString>
typedef struct _student
{
    int id;
    QString name;
    float score;
}Student;
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Student stu;
    memset(&stu, 0, sizeof(Student));
    printf("sizeof(int)=%d, sizeof(float)=%d, sizeof(小明)=%d, size=%d\n", sizeof(int), sizeof(float), sizeof("小明"), sizeof(Student));
    stu.id = 1;
    stu.name = "小明";
    stu.score = 80;
    printf("id=%d,name=%s,score=%f\n", stu.id, stu.name.toStdString().c_str(), stu.score);
    return a.exec();
}

运行如下:
在这里插入图片描述

显示到了18行,才报出了QString数据结构破坏的错误!
首先sizeof(QString)获取它的大小就是一个错误,因为QString的大小是动态变化的,而sizeof()只能获取基本数据类型的大小,获取编译时确定大小的类型
而memset也不适合QString,因为QString内存里面有内部数据结构,如果memset了,那么就破坏了QString内部的数据结构,而基本类型,内部是无数据结构的

关于sizeof的用法:

在 C 语言中,sizeof 是一个运算符,用来获取一个数据类型或数据结构在内存中所占的字节数。它是一个编译时运算符,不会在运行时进行计算,而是由编译器在编译时确定大小。
语法:
sizeof(数据类型)
或者:
sizeof(任何有效表达式)
sizeof会返回该表达式结果的类型大小。
使用
获取基本数据类型的大小
sizeof 可以用于查询基本数据类型(如 int、float、char)的大小。

关于memset

memeset 作用是将一段内存的数据全部设置为指定值,函数原型为:
void *memset(void *dest,int c,size_t count);
头文件:
  使用时引入<memory.h>头文件
作用:
  将dest指针指向的内存区域的前count个字符设置为c,并返回指向这个存储区的指针。

总结

sizeof(),memset(),只适合基本数据类型,对于复杂数据类型是不适合的,因为复杂数据类型里面有自己的数据结构,比如:如引用计数、指针等。
如下图所示:
在这里插入图片描述

比如,拿QString数据类型来说:
在这里插入图片描述

如果把这些成员变量memset之后,这个QString就没法用了。
QString 通过 clear()函数进行清空即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员如山石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值