繁体   English   中英

wxWidgets中的“删除”和“破坏”之间有什么区别?

[英]What's the difference between 'delete' and 'destroy' in wxWidgets?

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

应用程序

#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;
}

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

deletedestroy之间有什么区别,它们是否做相同的事情?

WXWidgets在其wiki上有一个解释:

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

核心保留打开窗口的列表,它将决定何时实际在这些对象上调用delete 客户永远不要直接自己调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM