Ответ 1
Здесь рассматривается очистка: http://docs.wxwidgets.org/2.9.2/overview_windowdeletion.html
Я пытаюсь изучить 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.
Здесь рассматривается очистка: http://docs.wxwidgets.org/2.9.2/overview_windowdeletion.html
См. примечание в примере Hello World в wikiWxWidgets:
http://wiki.wxwidgets.org/Hello_World
"Вы можете задаться вопросом, почему переменная frame не удаляется нигде. При установке фрейма в качестве верхнего окна приложения приложение удалит фрейм для нас (для более подробного объяснения, см." Устранение утечек памяти").
Однако код, который вы отправили, не вызывает SetTopWindow()
, как это делает код из вики. Поэтому я предполагаю, что это просочится.
Утечка памяти возникает, когда программа продолжает выделять память и не выпускает ее. В конце концов, такая программа закончит новую память для выделения и остановки.
MyApp:: OnInit() вызывается один раз при запуске программы. Память для кадра выделяется один раз и сохраняется до тех пор, пока программа не закончится, и это именно то, что вам нужно. Нет утечки памяти, потому что новый wxFrame в OnInit() вызывается только один раз.
Вполне возможно, что wxWidgets регистрирует указатель wxFrame и присматривает за его утилизацией, если программа отключается изящно. Это было бы неплохо, но не имеет практической разницы.