wxWidgets OnInit

时间:2011-11-15 13:51:40

标签: 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;
}

但这不是:

#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;
}

它不会给出任何编译/链接/执行错误,只是不显示窗口。为什么这样?

2 个答案:

答案 0 :(得分:1)

Show函数立即返回,以便立即销毁wxFrame对象(因为它是在堆栈上创建的) - &gt;所以没有什么可以展示的。

如果使用new创建框架,退出函数后对象不会被销毁。

答案 1 :(得分:1)

你不应该在堆栈上创建wxWindow类(wxFrame,panel等),你应该只在堆上创建它。我们会在wikidocs中详细解释。

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;
}