wxWidgets中'delete'和'destroy'之间有什么区别?

Lio*_*ing 1 c++ wxwidgets

我在使用deletedestroy在我的情况下想要删除对象时感到困惑,例如:

app.h

#include "taskBarIcon.h"
class myApp: public wxApp{
public:
    // ....
private:
    CTaskBarIcon *m_pTaskbar; // = NULL
};
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

以前的代码在退出程序时会导致运行时错误,原因是删除成员变量m_pTaskbar:

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

但请注意,我this->Destroy()CTaskBarIcon.cpp代码的不同位置使用过.

delete和之间有什么区别destroy,他们是否做同样的事情?

Som*_*ken 11

WXWidgets对他们的wiki有一个解释:

wxCloseEvent处理程序应该只调用wxWindow::Destroy()删除窗口,而不是使用delete运算符.这是因为对于某些窗口类,wxWidgets会延迟实际删除窗口,直到所有事件都被处理完毕,否则会有事件被发送到不存在的窗口的危险.

核心保留一个打开的窗口列表,它将决定何时实际调用delete这些对象.客户端永远不应该直接调用它.