wxWidgets内存管理标准实践

wxWidgets Memory Management standard practice

我已经开始使用 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 显示带有一些控件的 window。

我猜你是在 Linux?

所有这些都是来自系统库的误报或泄漏。

就wxWidgets 而言,您不需要删除为wx 对象分配的内存。该库在内部像智能指针一样工作。

当你创建一个主框架时,它会在应用程序对象被销毁时被删除。当您创建一个面板作为主框架的父级时,它将在主框架被销毁时自动删除,这将在应用程序对象被销毁时发生。

等等-就像在儿童诗中一样This is the house that Jack built。您不必在析构函数中执行任何操作。

然而,如果您为任何 non-wx 对象分配内存,您绝对必须释放它(在指针上调用 delete)。

[编辑]

非常重要!!

此外,请理解 - 非常重要的部分 - 所有这些控件都必须有一个父级 window 作为构造函数的第一个参数。

此外,当您尝试创建模态对话框时,该对话框可能没有父项(传递 NULL)。在这种情况下——不要在堆上创建它!!在堆栈上创建它,当变量超出范围时,对话框对象将被销毁。具有自动删除所有子项的相同概念。

这是 wxWidgets 中堆与栈创建的唯一例外。

[/编辑]