标题:让我抓狂且无法理解的 Bug
作者:20091001753
日期:2023-03-23 02:19
内容:
提供 Demo 下载
无法理解,以至于吓得我不敢写代码了,因为太恐怖了。
先说下环境:vs2019,Win11,x64,cpu 锐龙R7
这是一个很正常的类,用一个结构体保存着数据
诡异的情况出现了
我无法理解,没有修改 p 指针的内容,前后两次输出仅仅只是 new 了一个类,数据就没了(或是缺少部分字符)!
针对这个现象,我继续做了几个试验:
1,如果 Data 结构体比较小,例如把 char inf[1000] 的 1000 改成 100,那么异常发生的概率就会减少(50%)
2,如果 Nib 里的 m_data 没有初始化,例如没有 m_data{0} 后面的 {0},异常发生的概率极少。
3,即使换种方法初始化,例如在 Nib 的构造函数里用 memset(&m_data,0,sizeof(m_data)); 这种异常也是大概率发生的。
举例
为什么我要将数据保存在 QVariant 中?
这个 Demo 只是我复现该 bug 精简的。
实际情况是:
程序的初始会载入配置文件,将配置信息构建成 QMap,key-value 形式
值种类比较多,有的是 QString,有的是 int,遇到结构体数据,就用 QByteArray,所以 value 统一用 QVariant
#1 [llong 03-23 09:34]
auto p = (Nib::Data*)v.toByteArray() .data() ;
toByteArray() 返回的是一个右值,这个右值在这行语句结束后析构,p指针指向的内存已经析构了,这段代码崩溃都是可能的,应改为
auto byteArray = v.toByteArray();
auto p = byteArray.data();
#2 回 llong 的帖子 [liulin188 03-23 11:12]
llong:auto p = (Nib::Data*)v.toByteArray() .data() ;
toByteArray() 返回的是一个右值,这个右值在这行语句结束后析构,p指针指向的内存已经析构了,这段代码崩溃都是可能的,应改为
auto byteArray = v.toByteArray();
auto p = byteArray.data(); (2023-03-23 09:34)
正解,这个错误我也犯过,确切的说那是一个临时对象。
#3 [liudianwu 03-23 18:40]
Qt武林秘籍https://gitee.com/feiyangqingyun/qtkaifajingyan (看完学完20K起薪)第185条