如何处理内存泄漏?

时间:2011-08-22 10:25:42

标签: qt memory-management memory-leaks

我对内存处理并不熟悉,但我目前正在开发Qt项目(c ++),使用Qt Nokia SDK为Symbian设备开发应用程序。

平台:Windows 7

第一个问题: 如果我创建一个这样的按钮:

  

QPushButton * button = new QPushButton(parent);

我必须删除它吗? (我认为不,因为它是用户界面的一部分,但如果我错了,请纠正我。)

2'问题: 我怎么能找到内存泄漏,你知道有什么好的程序可以帮助我吗?

我尝试过使用诺基亚分析工具,但是当我运行atool时:

  

atool.exe -lf build armv5 udeb -f phoneMeomoryLog

我得到了

  

构建类型:udeb构建平台:armv5数据收集模式:登录到   file分配调用堆栈大小:40自由调用堆栈大小:0延迟   free:功能已禁用堆损坏检查(保护块):功能   disabled AnalyzeTool:错误,创建/读取makefile。

希望有人能回答我。

提前致谢

4 个答案:

答案 0 :(得分:2)

第一个问题:不,你不必删除它。删除父级时,系统会将其删除。因此,您必须删除可能是表单或对话框的父级。

使用Qt::WA_DeleteOnClose标志创建对话框时,当窗口小部件接受关闭事件时,Qt将删除此窗口小部件。所以你不会有任何内存泄漏。

所以用这个标志创建你的对话框并按照你现在的方式添加你的小部件,你会没事的。

2'问题:如果你在linux上运行使用valgrind。

示例: valgrind --tool = memcheck --leak-check = yes ./myprogramname

valgrind有许多选项可用于微调。

如果使用较旧的c ++或QScopedPointer,还使用* unique_ptr *或* auto_ptr *是一种很好的编程技术,可以避免内存泄漏。

答案 1 :(得分:1)

  1. 第一个Q的答案是否定的。似乎与Windows标准GUI对象不同,在Qt中你不应该删除它。它在主窗口关闭时被释放。

  2. 您可以使用嵌入在VS的微软内存链路检测器。在this link中找到更多信息。

答案 2 :(得分:0)

两者都是“当主窗口关闭时它被释放。”和“父母只是释放UI资源,而不是内存!!! - hsalimi”是错误的。父项保留其子项列表,并在自身被销毁时删除它们。这与“UI资源”或“主窗口”无关,这是正常的QObject行为。 std :: auto_ptr在这里既不需要也不有用。

答案 3 :(得分:-1)

好吧,我没有Qt Nokia SDK的经验,但是基于我的C ++知识。

  1. 是。新的所有东西都应该被释放出来。指针不能释放自身,C ++不提供任何垃圾收集器。

  2. 有几种方法。例如,检查您正在执行的 new 的数量以及 delete 的数量。对于每个新的,应该有一个删除。检查使用的内存:如果使用的内存只增长而从不(或不经常)减少,那么你就不能正确处理内存。确保删除析构函数中的任何已分配资源。

  3. 为避免这种情况,您可以使用auto-pointers