【问题标题】:Why does wxWidgets not leak Frames?为什么 wxWidgets 不泄漏 Frames?
【发布时间】:2011-09-11 10:34:02
【问题描述】:

我正在尝试学习 wxWidgets,但我遇到了一个问题,我无法在文档中的任何地方找到解释。我正在尝试理解这个最小的 wxWidgets 程序:

#include <wx/wx.h>

class MyApp : public wxApp
{
    virtual bool OnInit();
};

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
    wxFrame *frame = new wxFrame(NULL, -1, _("Hello World"), wxPoint(50, 50),
                                  wxSize(450, 350));       
    frame->Show(true);
    return true;
}

具体来说,为什么frame不泄露?什么时候发布,是谁的责任?在一个正常的程序中,一个指针没有被传递给任何东西并且超出范围而没有被删除几乎可以肯定是一个泄漏,但显然在 wxWidgets 中不是这样。

【问题讨论】:

  • 它可能会在框架中注册自己,在窗口关闭时被删除。
  • @Xeo 此代码直接来自文档中的示例代码(为了强调而删减)。我找不到任何删除框架的示例代码,所以我假设它确实以某种方式被删除。同时,我在文档中找不到任何明确说明 Frame 将被删除的内容,所以我希望 SO 上的某个人有完整的故事。
  • 啊——我找到了完整的答案here

标签: c++ wxwidgets


【解决方案1】:
【解决方案2】:

请参阅 wxWidgets wiki 上 Hello World 示例中的注释:

http://wiki.wxwidgets.org/Hello_World

"你可能想知道为什么 frame 变量没有在任何地方被删除。通过将 frame 设置为应用程序的顶部窗口,应用程序将为我们删除框架(更深入的解释,请参阅避免内存泄漏)。”

但是,您发布的代码不像 wiki 中的代码那样调用 SetTopWindow()。所以我想它会泄漏。

【讨论】:

  • 我认为这实际上是不正确的。 The Documentation 声明“您不必设置顶部窗口;这只是为了方便”。我刚刚找到wxTopLevelWindow 的文档,其中指出“wxTopLevelWindow 的实例由内部顶级窗口列表中的 wxWidgets 管理”。
  • 好吧,正是顶层使得它不会泄漏......如果暗示所有 wxFrames 都是顶层,那么我猜它是。 Qt 不能那样工作,顺便说一句。如果你还没有尝试过 Qt,我会补充一点,它的架构(和文档)比 wxWidgets 好得多:doc.qt.nokia.com/latest/tutorials-widgets-toplevel.html
  • 我看过 QT,但它的 lack of exception safety 让我认为它不适合任何高度重视正确性的应用程序。
  • wxWidgets 的哪些属性是异常安全的,而在 Qt 中是不安全的?来自 wxWidgets 常见问题解答:“不幸的是,wxWidgets 库本身不是异常安全的(因为它的初始版本早于 C++ 语言中添加的异常)。” wxwidgets.org/docs/faqgen.htm#exceptions
  • 我也不太喜欢 wxWidgets。
【解决方案3】:

当程序不断分配内存并且从不释放它时,就会发生内存泄漏。最终这样的程序将耗尽新的内存来分配和停止。

MyApp::OnInit() 在程序启动时调用一次。框架的内存分配一次并一直分配到程序结束,这正是您需要发生的事情。没有内存泄漏,因为 OnInit() 中的新 wxFrame 只被调用一次。

wxWidgets 很可能会注册 wxFrame 指针并在程序正常关闭时对其进行整理。那会很好,但没有实际区别。

【讨论】:

  • 有一个实际的区别。首先,如果你只是让程序以一个出色的动态对象结束......析构函数永远不会运行。即使你有一个微不足道的析构函数,你仍然会遇到一个问题,即如果你使用 Valgrind 或其他报告工具,很难区分这种“有目的的”内存泄漏和“意外”的内存泄漏。
猜你喜欢
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多