• 13458阅读
  • 5回复

[提问]有没有适合检测Qt工程内存泄漏的工具? [复制链接]

上一主题 下一主题
离线xuang
 

只看楼主 倒序阅读 楼主  发表于: 2014-01-11
用Qt做了一个数据入库的软件,需要长时间放在服务器上运行,但是现在发现内存总是在增长,所以怀疑在哪里有内存泄漏了,但是用了一些内存泄漏检测工具都不好使(如Visual Leak Detector),即便是空的Qt工程也会报一大堆内存泄漏,可能是因为Qt本身的父子对象机制造成的。所以想请教各位前辈们,你们在Qt工程里是怎么检测内存泄漏的?不会真的是一行一行单步调试吧?
离线xuang

只看该作者 1楼 发表于: 2014-01-11
还有一个刚刚发现的问题:Qt中的QTreeWidgetItem、QTableWidgetItem、QListWidgetItem这三个类好像不是继承自QObject,所以是不是不适用于Qt自己的父子对象销毁机制?我在这种视图类显示刷新的时候总是先clear(),然后重新new一大串需要显示的item,这样会内存泄露吗?Qt的帮助文档里QListWidget类的clear()是这么说的:Warning: All items will be permanently deleted.这不是会删除吗?
离线渡世白玉

只看该作者 2楼 发表于: 2014-01-11
QListWidget 还有tablewidget的clear会释放WidgetItem的内存的、、
只是Qt内部好像也维护着一个内存池的东西的、、
好像tablewidget类似的clear后每个tem的内存都被释放了,但是没有释放给操作系统,很多是Qt内部管起来,便于下次快速申请的、、、
现在发现内存总是在增长、、、这个你再检查一下你的代码呢、、、
话说服务器上的就应该用不到GUI模块把?
离线xuang

只看该作者 3楼 发表于: 2014-01-11
回 2楼(渡世白玉) 的帖子
谢谢,你说的这个释放了内存但是没有释放给操作系统是什么意思?是不是我用任务管理器查看进程的内存数不会减少?
这个程序其实本来不是在服务器上运行的,只是对方临时提的要求所以我才会检查内存泄漏的问题。
离线渡世白玉

只看该作者 4楼 发表于: 2014-01-11
回 3楼(xuang) 的帖子
内存池的概念、、、释放了,但是程序自己管理,下次需要申请内存时,优先利用这些内存,不会再去向系统申请内存、、、
离线彩阳

只看该作者 5楼 发表于: 2014-01-12
如果无法使用调试器,那么可以试试:
QObject::connect( pTheObjectInheritedByQObject, SIGNAL( destroyed( QObject* ) ),
pYourSlotClass, SLOT( yourSlot( QObject* ) );
再在yourSlot( QObject* )中输出该object。
有调试器的话,可下断点下在yourSlot()函数中,查看调用堆栈。
上海Qt开发联盟,热忱地欢迎你的加入!
快速回复
限100 字节
 
上一个 下一个