我正在尝试学习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中并非如此。
答案 0 :(得分:6)
答案 1 :(得分:3)
请参阅wxWidgets wiki上的Hello World示例中的注释:
http://wiki.wxwidgets.org/Hello_World
“你可能想知道为什么帧变量不会被删除。通过将帧设置为应用程序的顶部窗口,应用程序将为我们删除帧(为了更深入的解释,请参阅避免内存泄漏。“
但是,您发布的代码不会像wiki中的代码那样调用SetTopWindow()
。所以我想它会泄漏。
答案 2 :(得分:-1)
当程序继续分配内存并且从不释放内存时,会发生内存泄漏。最终这样的程序将耗尽新内存来分配和停止。
MyApp :: OnInit()在程序启动时调用一次。帧的内存被分配一次并保持分配直到程序结束,这正是您需要发生的事情。没有内存泄漏,因为OnInit()中的新wxFrame只被调用一次。
很可能wxWidgets注册了wxFrame指针,并在程序正常关闭时进行整理。那会很好,但没有实际的区别。