wxWidgets OnInit - PullRequest
       7

wxWidgets OnInit

0 голосов
/ 15 ноября 2011

Этот код работает нормально:

#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 ]

1 голос
/ 23 августа 2017

Вы не должны создавать классы wxWindow (wxFrame, панель и т. Д.) В стеке, вы должны создавать их только в куче.Это подробно объясняется в вики и в документах .

Ответ INS также является правильным, но единственный способ создатьПриложение 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;
}
1 голос
/ 25 ноября 2011

Функция Show немедленно возвращается, поэтому объект wxFrame сразу уничтожается (как он создается в стеке) -> поэтому отображать нечего.

Если вы создаете кадр с помощью new, объект не разрушается после выхода из функции.

...