问题描述
我已经开始使用c ++玩wxWidgets。我已经按照教程制作了一个简单的hello world应用程序。
出于好奇,我通过valgrind运行了编译的程序,并得到了以下结果。
==92057== LEAK SUMMARY:
==92057== definitely lost: 91,768 bytes in 292 blocks
==92057== indirectly lost: 119,108 bytes in 4,828 blocks
==92057== possibly lost: 9,238 bytes in 143 blocks
==92057== still reachable: 4,590,951 bytes in 43,100 blocks
==92057== of which reachable via heuristic:
==92057== length64 : 13,360 bytes in 199 blocks
==92057== newarray : 2,528 bytes in 78 blocks
==92057== suppressed: 0 bytes in 0 blocks
该输出是否值得信任?是否存在释放与wxWidgets相关的内存的标准方法?
例如:
wxButton *clear = new wxButton(panel,ID_RESET,wxT("Clear"));
是否应该在析构函数中为其父对象删除它?通过我自己的代码,我没有在该项目中进行任何内存分配。只是通过wxWidgets显示带有某些控件的窗口。
解决方法
我想您是在Linux上做的吗?
所有这些都是来自系统库的误报或泄漏。
就wxWidgets而言,您不需要删除为wx对象分配的内存。该库在内部像智能指针一样工作。
创建主框架时,将在销毁应用程序对象时将其删除。当您创建一个面板作为主框架的父面板时,该面板将在主框架被破坏时被自动删除,这将在应用程序对象被破坏时发生。
以此类推-就像儿童诗This is the house that Jack built
中一样。您无需在析构函数中做任何事情。
但是,如果为任何非wx对象分配内存,则绝对必须释放它(在指针上调用delete
)。
[编辑]
非常重要!
另外,请理解-非常重要的部分-所有这些控件都必须具有父窗口作为构造函数的第一个参数。
此外,当您尝试创建模式对话框时,该对话框可能没有父级(传递NULL)。在这种情况下-不要在堆上创建它!在堆栈上创建它,并且当变量超出范围时,对话框对象将被销毁。具有自动删除所有子项的相同概念。
这是wxWidgets中堆与栈创建的唯一例外。
[/ EDIT]