[wxWidgets] czyszczenie pamięci

0

Zastanawia mnie pewien mechanizm przekazywania obiektów tworzonych dynamicznie,

W przykładach wxWidgets spotykam takie wywołania:
sizerTop->Add(new wxStaticText(this, .....
Natomiast w samym destruktorze nie widzę ani usunięcia obiektu sizerTop, nawet jeśli by był, to on z default'a usunie też 'statictext' zadeklarowany w metodzie dodającej Add

Czy całe czyszczenie pamięci jest przerzucone na system?

cały kod poniżej,

MyDialog::MyDialog(const wxString& title)
        : wxDialog(NULL, wxID_ANY, title)
{
    wxSizer * const sizerTop = new wxBoxSizer(wxVERTICAL);

    wxSizerFlags flags;
    flags.Border(wxALL, 10);

    sizerTop->Add(new wxStaticText
                      (
                        this,
                        wxID_ANY,
                        wxT("Press 'Hide me' to hide this window, Exit to quit.")
                      ), flags);

    sizerTop->Add(new wxStaticText
                      (
                        this,
                        wxID_ANY,
                        wxT("Double-click on the taskbar icon to show me again.")
                      ), flags);

    sizerTop->AddStretchSpacer()->SetMinSize(200, 50);

    wxSizer * const sizerBtns = new wxBoxSizer(wxHORIZONTAL);
    sizerBtns->Add(new wxButton(this, wxID_ABOUT, wxT("&About")), flags);
    sizerBtns->Add(new wxButton(this, wxID_OK, wxT("&Hide")), flags);
    sizerBtns->Add(new wxButton(this, wxID_EXIT, wxT("E&xit")), flags);

    sizerTop->Add(sizerBtns, flags.Align(wxALIGN_CENTER_HORIZONTAL));
    SetSizerAndFit(sizerTop);
    Centre();

    m_taskBarIcon = new MyTaskBarIcon();
#if defined(__WXCOCOA__)
    m_dockIcon = new MyTaskBarIcon(wxTaskBarIcon::DOCK);
#endif

    // we should be able to show up to 128 characters on recent Windows versions
    // (and 64 on Win9x)
    if ( !m_taskBarIcon->SetIcon(wxICON(sample),
                                 "wxTaskBarIcon Sample\n"
                                 "With a very, very, very, very\n"
                                 "long tooltip whose length is\n"
                                 "greater than 64 characters.") )
    {
        wxLogError(wxT("Could not set icon."));
    }
}

MyDialog::~MyDialog()
{
    delete m_taskBarIcon;
#if defined(__WXCOCOA__)
    delete m_dockIcon;
#endif
}
0

Za usunięcie sizera odpowiedzialne jest okno lub inny sizer, do którego został przypisany.

0

Czyli rozumiem, że z automatu zostanie również usunięty przekazany w parametrze Button

sizerBtns->Add(new wxButton(this, wxID_ABOUT, wxT("&About")), flags);

A kiedy zostaje wywołany destruktor sizera?

i niepoprawna jest kontrukcja
wxButton *n=new wxButton(this, wxID_ABOUT, wxT("&About"));
sizerBtns->Add(n, flags);

delete sizerBtns; //bez przypisania sizeBtns=0;

bo otrzymamy AV
....
OK

0

A kiedy zostaje wywołany destruktor sizera?

Przy niszczeniu okna lub przypisywaniu nowego sizera.

i niepoprawna jest kontrukcja (...)

Wygląda poprawnie, więc nie wiem skąd ten błąd. No chyba że przypisujesz usunięty sizer (co nie jest zbyt mądre), ale wtedy to nie jest wina konstrukcji, którą podałeś, tylko tego, co się dalej dzieje ze wskaźnikiem sizerBtns.

1 użytkowników online, w tym zalogowanych: 0, gości: 1