用memset()操作QString导致程序崩溃的原因

今天写的QT程序,跑起来了以后报段错误,程序崩溃。

定位到问题后发现是因为用memset()函数操作结构体时,结构体中包含了QString类型的变量。

对此变量进行memset()操作时,会导致程序崩溃。

 

代码中跟进QString类型中,QString其实是一个类类型。

数据类型 = 数据抽象 = 没有行为的那些类型 = { int, char, double... }
类类型 = 行为抽象 = 有行为有属性的那些类型 = { vector<int>, student, employee, ...}

 

memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的。其原型是:

void* memset(void *_Dst, int _Val, size_t _Size);

参数解释:_Dst是目标起始地址,_Val是要赋的值,_Size是要赋值的字节数。

函数解释:将_Dst中当前位置后面的_Size个字节(typedef unsigned int size_t)用_Val 替换,并返回_Dst。

memset函数的作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。

注意:memset是逐字节拷贝的。

 

这样在memset()类类型时,按字节顺序将对象所在空间清零,破坏了对象的成员结构,所以在调用的时候出现段错误导致程序崩溃。

所以上面的结论不太严谨,应该是memset()操作QString类型的变量后,再次调用该变量会导致程序崩溃,仅仅进行memset()而不调用,并不会有问题。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值