此代码可以正常工作:
#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;
}
但这不是:
#include <wx/wx.h>
class MyApp : public wxApp
{
virtual bool OnInit();
};
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
wxFrame frame(NULL, -1, _("Hello World"), wxPoint(50, 50),
wxSize(450, 350));
frame.Show(true);
return true;
}
它不会给出任何编译/链接/执行错误,只是不显示窗口。为什么这样?
答案 0 :(得分:1)
Show
函数立即返回,以便立即销毁wxFrame
对象(因为它是在堆栈上创建的) - &gt;所以没有什么可以展示的。
如果使用new
创建框架,退出函数后对象不会被销毁。
答案 1 :(得分:1)
你不应该在堆栈上创建wxWindow类(wxFrame,panel等),你应该只在堆上创建它。我们会在wiki和docs中详细解释。
INS's answer也是正确的,但创建wx应用程序的唯一方法不是通过内存泄漏。 wxWidgets在程序执行完毕后自动删除它的wxWindow类。这就是为什么我们不删除该类(也不是您正在使用的wxApp)。对于其余的对象,您可以使用wxApp :: OnExit()函数手动删除堆上的任何其他数据。
#include <wx/wx.h>
class MyApp : public wxApp
{
public:
virtual bool OnInit();
virtual int OnExit();
private:
wxFrame *m_frame;
int *m_foo;
};
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
m_frame = new wxFrame(nullptr, -1, wxT("No leaks"), wxPoint(-1, -1),
wxSize(300, 200));
m_frame->Show(true);
m_foo = new int(2);
return true;
}
int MyApp::OnExit(){
// Any custom deletion here
// DON'T call delete m_frame or m_frame->Destroy() m_frame here
// As it is null at this point.
delete m_foo;
return 0;
}