2011-08-22 60 views
1

我对内存处理并不熟悉,但我目前正在使用Qt诺基亚SDK开发Qt项目(C++),为Symbian设备开发应用程序。如何处理内存泄漏?

平台:视窗7

第1'问题: 如果我创建这样的按钮:

QPushButton *按钮=新QPushButton(父);

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

2'nd question: 我如何找到内存泄漏,你知道任何可以帮助我的好程序吗?

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

atool.exe -LF打造的ARMv5 udeb的-f phoneMeomoryLog

我只是得到

构建方式:udeb构建平台:armv5数据采集模式:登录到 文件分配调用堆栈大小:40免费调用堆栈大小:0推迟 空闲:特征dis能够堆损坏检查(防护块):功能 已禁用AnalyzeTool:错误,正在创建/读取makefile。

希望有人能回答我。

在此先感谢

回答

1
  1. 回答你的第一个Q是第看来,不像Windows标准GUI对象,Qt中你不应该将其删除。当你的主窗口关闭时它会被释放。

  2. 您可以使用嵌入在VS的微软存储器链接检测器。在this link中查找更多内容。

+0

你在Qt程序中试过这个吗? – Ikky

-1

那么,我没有Qt诺基亚SDK的经验,但基于我的C++知识。

  1. 是的。新创建的所有东西都会被释放。指针不能释放自己,C++不提供任何垃圾收集器。

  2. 有几种方法。例如,检查你正在做多少个新的以及多少个删除的。对于每个新的应该有一个删除某处。检查使用的内存:如果内存使用只增长,永远不会(或不经常)减少,那么你没有正确处理内存。确保你正在删除析构函数上的任何已分配资源。

为了避免这种情况,你可以使用auto-pointers

2

第1'的问题:不,你没有将其删除。当亲本被删除时,它将被删除。所以你必须删除可能是表单或对话框的父代。

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

因此,使用此标志创建对话框并按照现在的方式添加您的小部件,您将会很好。

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

例如:的valgrind --tool = MEMCHECK --leak检查= YES ./myprogramname

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

如果您使用较旧的C++或QScopedPointer,还可以使用* unique_ptr *或* auto_ptr *是避免内存泄漏的良好编程技巧。

+0

一直在看Valgrind。现在安装Qt SDK到linux,所以我可以检查出来。感谢所有的答案,这真的有帮助。 – Ikky

+0

它有些指针是由新的内存分配的,它应该稍后删除。父母只是释放UI资源,而不是内存! – hsalimi

+3

阅读QT的http://doc.qt.nokia.com/4.6/objecttrees.html(对象树和对象所有权)。它明确指出:“当你用另一个对象创建一个QObject作为父对象时,它被添加到父对象的children()列表中,并且在父对象被删除时被删除。” –

0

两者“当您的主窗口关闭时正在释放。”和“父母刚刚释放UI资源,而不是内存!!! - hsalimi”是错误的。父母保留其子女的列表,并在其自身遭到破坏时将其删除。这与“UI资源”或“主窗口”无关,这是正常的QObject行为。 std :: auto_ptr在这里既不需要也不用。