Qt std :: bad_alloc
Posted DreamLife.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt std :: bad_alloc相关的知识,希望对你有一定的参考价值。
文章目录
关键字:
std
、
bad
、
alloc
、
OOM
、
异常退出
摘要
今天又是被BUG统治的一天,刚使用物理方法解决了“QVector "isDetached()"又来一个”std :: bad_alloc“,这个问题更是没法下手。只能摸索尝试,仅此记录。
问题出现原因
根据问题名字,猜测应该就是内存申请失败造成的。这里引用网友内容
- 该进程请求的内存多于可以提供的内存
- 地址空间过于分散,无法满足大块连续内存的请求
- 堆管理数据结构已损坏
第一种 请求内存多余系统可提供内存
这里最担心其实就是内存溢出了,也就是请求内存多余系统可以提供的内存了,我里面有好几个容器,如果是申请了,没有释放,那内存溢出基本是妥妥了吧,所以排查代码,找到容器new 的地方,检查一下。完了在机器上一直监控程序内存运行情况
比较常见的饿解决方法就是在new的地方使用try-catch来解决,但是Qt里面会有大量的new操作,在 STACK OVERFLOW有一个帖子,可以看一下。
所以我没有针对大量的new操作做 try-catch操作,这两我将两个我每次都会auto 的容器做了static 操作,目前正在测试,根绝我实际的程序内容,我确定如果是内存不够,那就是这两容器频繁申请造成的结果,但是这个修改其实我自己也不会报太大希望,因为我的变量是在函数内,理论上,函数执行完了,就应该被销毁才对。而且我用的是auto,根据我浅陋的对Qt的了解,这里我没有对容器进行写操作,所以不会触发Qt 的深拷贝操作,仅仅是新的变量指向了原来容器的地址。所以这样修改应该不会造成内存溢出这个问题吧,暂且尝试一下下。
第二种 地址空间过于分散,无法满足大块连续内存的请求
这个问题,目前没有找到啥好的解决方法,有两个链接可以参考一下
第三种 堆管理数据结构损坏
嘿嘿,这种神仙问题,岂是我等屁民能理解的,
https://www.codenong.com/21463585/
https://blog.csdn.net/qq_16542771/article/details/104349243
稍微总结下
找了这么多资料下来,基本核心思想都是找自己代码是不是有内存管理问题,所以还是老实Debug吧,看看具体问题出现在哪里了,我这里还用到一个方法,就是把代码回滚到上一个版本测试,看程序是否崩溃,如果不崩溃,那就对比下,在一个个排查。就这样。
没想到还能更新
今天带逐段代码排查的时候,发现这段代码注释掉就不会崩溃,至少目前是这样,但是呢,我有没有发现这段代码哪里有问题。
想着可能是auto 的问题,或者迭代器的问题,所以我改了一遍代码
目前在跑测试,看看结果咋样。
参考
https://qa.1r1g.com/sf/ask/1502450981/
https://blog.csdn.net/english72428/article/details/127041276
https://blog.csdn.net/mercy_ps/article/details/81347067
https://cloud.tencent.com/developer/section/1012708
https://stackoverflow.com/questions/1308052/policy-with-catching-stdbad-alloc
https://stackoverflow.com/questions/52638843/qt5-throws-stdbad-alloc
https://learn.microsoft.com/zh-CN/troubleshoot/developer/webapps/aspnet/health-diagnostic-performance/troubleshoot-outofmemoryexception
https://learn.microsoft.com/zh-cn/archive/blogs/tess/who-is-this-outofmemory-guy-and-why-does-he-make-my-process-crash-when-i-have-plenty-of-memory-left
https://blog.csdn.net/weixin_39094034/article/details/110225908
https://blog.csdn.net/liuzehn/article/details/80830279
以上是关于Qt std :: bad_alloc的主要内容,如果未能解决你的问题,请参考以下文章