Почему wxWidgets не теряет рамки?

Я пытаюсь изучить 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.

Ответ 2

См. примечание в примере Hello World в wikiWxWidgets:

http://wiki.wxwidgets.org/Hello_World

"Вы можете задаться вопросом, почему переменная frame не удаляется нигде. При установке фрейма в качестве верхнего окна приложения приложение удалит фрейм для нас (для более подробного объяснения, см." Устранение утечек памяти").

Однако код, который вы отправили, не вызывает SetTopWindow(), как это делает код из вики. Поэтому я предполагаю, что это просочится.

Ответ 3

Утечка памяти возникает, когда программа продолжает выделять память и не выпускает ее. В конце концов, такая программа закончит новую память для выделения и остановки.

MyApp:: OnInit() вызывается один раз при запуске программы. Память для кадра выделяется один раз и сохраняется до тех пор, пока программа не закончится, и это именно то, что вам нужно. Нет утечки памяти, потому что новый wxFrame в OnInit() вызывается только один раз.

Вполне возможно, что wxWidgets регистрирует указатель wxFrame и присматривает за его утилизацией, если программа отключается изящно. Это было бы неплохо, но не имеет практической разницы.