• 1024阅读
  • 3回复

让我抓狂且无法理解的 Bug [复制链接]

上一主题 下一主题
离线20091001753
 

只看楼主 倒序阅读 楼主  发表于: 2023-03-23
提供 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)); 这种异常也是大概率发生的。

untitled.7z (2 K) 下载次数:3

举例


为什么我要将数据保存在 QVariant 中?
这个 Demo 只是我复现该 bug 精简的。

实际情况是:
程序的初始会载入配置文件,将配置信息构建成 QMap<QString,QVariant>,key-value 形式
值种类比较多,有的是 QString,有的是 int,遇到结构体数据,就用 QByteArray,所以 value 统一用 QVariant

(づ ̄ 3 ̄)づ
离线llong

只看该作者 1楼 发表于: 2023-03-23
auto p = (Nib::Data*)v.toByteArray() .data() ;
toByteArray() 返回的是一个右值,这个右值在这行语句结束后析构,p指针指向的内存已经析构了,这段代码崩溃都是可能的,应改为
auto byteArray = v.toByteArray();
auto p = byteArray.data();
4条评分好评度+1贡献值+1金钱+10威望+1
20091001753 好评度 +1 - 2023-03-23
20091001753 贡献值 +1 - 2023-03-23
20091001753 威望 +1 - 2023-03-23
20091001753 金钱 +10 - 2023-03-23
离线liulin188

只看该作者 2楼 发表于: 2023-03-23
回 llong 的帖子
llong:auto p = (Nib::Data*)v.toByteArray() .data() ;
toByteArray() 返回的是一个右值,这个右值在这行语句结束后析构,p指针指向的内存已经析构了,这段代码崩溃都是可能的,应改为
auto byteArray = v.toByteArray();
auto p = byteArray.data(); (2023-03-23 09:34) 

正解,这个错误我也犯过,确切的说那是一个临时对象。
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
离线liudianwu

只看该作者 3楼 发表于: 2023-03-23
Qt武林秘籍https://gitee.com/feiyangqingyun/qtkaifajingyan (看完学完20K起薪)第185条


欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
快速回复
限100 字节
 
上一个 下一个