【无标题】Qt程序占用内存过大导致程序崩溃

您所在的位置:网站首页 打包安装程序太占内存删不掉 【无标题】Qt程序占用内存过大导致程序崩溃

【无标题】Qt程序占用内存过大导致程序崩溃

2024-07-09 23:38| 来源: 网络整理| 查看: 265

最近写了一个项目,用Qt写一个显示8通道的时域频域图,在主界面有一些配置,然后双击任意一个通道,可查看该通道的具体时域频域图,刚开始写完后没有遇到什么问题,调试也一切正常。后来在测试阶段,发现运行一段时间之后,程序会变卡,到最后程序直接崩掉了,然后就开始找问题,找了好几天都没发现有什么问题,刚开始在网上搜了一下,看到说有可能是GPU占用过高导致程序崩溃,然后想到我用了setOpenGl函数,我就看了看我的任务管理器,发现GPU占用一直维持在50%左右,按道理来说这个GPU占用率是正常的,不是这个问题。后来我想是不是我的代码写的有问题,我就开始一句一句调试我的代码,调试发现也没什么问题,正当我抓耳挠腮之际,看到了博客上的一篇文章:QT 运行后有时会崩溃是什么原因? - 知乎 (zhihu.com)。

这篇文章记录了导致程序崩溃的几种原因。其中第一条写的是程序运行内存过大导致崩溃,一开始觉得写的程序并不复杂,应该不会是这种情况,但还是抱着试一试的心态看了看任务管理器里内存占用情况,发现了其中的奥秘。

打开程序时内存占用为30多MB,当连上网络时,内存占到了70多MB,到这里都没感觉有什么问题,当我打开其中一个通道界面查看时域频域图时,这时候内存占用到了100多MB,当我关闭这个界面时,按道理来说内存是会变小的,但是结果并非如此,关闭界面后内非但没有变小,反而会以1MB/s的速度持续增大,当我再打开一个界面时结果也是如此,反复几次之后,内存占用达到1GB左右,这时候程序卡住,然后过几秒直接崩溃。

后来反复试了几次发现依然如此,这时我发现了问题所在,果然是内存占用过大导致程序崩溃,但是这是一个小项目,也没有很多的功能,按道理来说不会出现这种问题呀,直到我看到了这篇文章QT界面小知识-Qt::WA_DeleteOnClose - 掘金 (juejin.cn)

 该博主描述的问题与我遇到的问题如出一辙,按照该博主的方法,我调试了一下我的子窗口的析构函数,当我关闭子窗口时,果然没有进入到析构函数当中,里面的内存也没有释放掉,这时候我就知道了问题所在了,当我关闭我的子窗口时,子窗口当中的内存没有及时释放掉,一直堆积在那,只有关闭主窗口时才会调用子窗口的析构函数。当打开的子窗口一直增加时,程序所占用的内存也不短增大,最后导致程序崩溃,之后在子窗口的构造函数当中加入了如下函数:

this->setAttribute(Qt::WA_DeleteOnClose);

希望这篇文章对大家有用!

同时有什么问题欢迎大家在评论区交流。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3