В чем разница между «удалить» и «уничтожить» в wxWidgets? - PullRequest
0 голосов
/ 05 сентября 2018

Я перепутал использование delete и destroy в моем случае, когда вы хотите удалить объект, например:

app.h

#include "taskBarIcon.h"
class myApp: public wxApp{
public:
    // ....
private:
    CTaskBarIcon *m_pTaskbar; // = NULL
};

app.cpp

int myApp::OnExit() {
    if (m_pTaskbar != NULL) {
        delete m_pTaskbar; // <-- The problem here
        m_pTaskbar = NULL;
    }
    return 0;
}
int myApp::OnRun() {
    mainFrm *_mainFrm = mainFrm::getInstance(); // The main window
    _mainFrm->Show(false);
    m_pTaskbar = new CTaskBarIcon(_mainFrm);
    m_pTaskbar->SetIcon(wxIcon("appIcon"), _mainFrm->GetTitle());      
    return wxApp::OnRun();
}

CTaskBarIcon.cpp

void CTaskBarIcon::rightButton_Click(wxTaskBarIconEvent & event) {
    PopupMenu(CreatePopupMenu());
}

void CTaskBarIcon::popupMenu_showWindow(wxCommandEvent & event) {
    m_pHandler->Iconize(false); // 'm_pHandler' is the main window
    m_pHandler->Show();
    m_pHandler->Raise();
    this->Destroy();
}

void CTaskBarIcon::popupMenu_showAbout(wxCommandEvent & event) {
    aboutFrm aboutWindow(m_pHandler, "About");
    aboutWindow.ShowModal();
    aboutWindow.Raise();
}

void CTaskBarIcon::popupMenu_exit(wxCommandEvent & event) {
    m_pHandler->Close(true);
    this->Destroy();
}

Предыдущий код вызывает ошибку времени выполнения при выходе из программы, и причиной этого является удаление переменной-члена m_pTaskbar:

// app.cpp
int myApp::OnExit() {
    if (m_pTaskbar != NULL) {
        delete m_pTaskbar; // <-- The problem here
        m_pTaskbar = NULL;
    }
    return 0;
}

Но учтите, что я использовал this->Destroy() в разных местах в CTaskBarIcon.cpp кодах.

Какая разница между delete и destroy, и они делают то же самое?

1 Ответ

0 голосов
/ 05 сентября 2018

WXWidgets имеет объяснение на вики :

Обработчик wxCloseEvent должен вызывать только wxWindow::Destroy() для удаления окно, и не используйте оператор delete. Это потому, что для некоторых окна классов, wxWidgets задерживает фактическое удаление окна до все события были обработаны, так как в противном случае существует опасность эти события будут отправлены в несуществующее окно.

Ядро хранит список открытых окон и решает, когда на самом деле вызвать delete для этих объектов. Клиент никогда не должен называть это непосредственно непосредственно.

...