C++ wxWidgets中的“删除”和“销毁”有什么区别?

C++ wxWidgets中的“删除”和“销毁”有什么区别?,c++,wxwidgets,C++,Wxwidgets,在我的例子中,当您要删除对象时,我混淆了使用delete和destroy,例如: 附录h app.cpp 前面的代码在退出程序时导致运行时错误,原因是删除成员变量m_pTaskbar: 但请注意,我在CTaskBarIcon.cpp代码中的不同位置使用了此->销毁 “删除”和“销毁”之间有什么区别,它们做的是相同的事情吗?WXWidgets对它们的功能进行了解释: wxCloseEvent处理程序应该只调用wxWindow::Destroy来删除 窗口,而不使用删除运算符。这是因为对一些人来说

在我的例子中,当您要删除对象时,我混淆了使用delete和destroy,例如:

附录h

app.cpp

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

但请注意,我在CTaskBarIcon.cpp代码中的不同位置使用了此->销毁


“删除”和“销毁”之间有什么区别,它们做的是相同的事情吗?

WXWidgets对它们的功能进行了解释:

wxCloseEvent处理程序应该只调用wxWindow::Destroy来删除 窗口,而不使用删除运算符。这是因为对一些人来说 窗口类,wxWidgets延迟窗口的实际删除,直到 所有事件都已处理,否则会有危险 事件将被发送到一个不存在的窗口


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

WXWidgets对其:

wxCloseEvent处理程序应该只调用wxWindow::Destroy来删除 窗口,而不使用删除运算符。这是因为对一些人来说 窗口类,wxWidgets延迟窗口的实际删除,直到 所有事件都已处理,否则会有危险 事件将被发送到一个不存在的窗口


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

DELIST是一个C++关键字,它在任何C++学习材料中都有介绍。我不知道Destroy是什么,但它可能包含在WxWidgets的文档中。Destroy是一个成员函数,你必须找到它才能看到它的作用。我不认为有理由否决这个问题。@Swardfish你的答案在这里不适用。问题是关于vxwidgets框架的,不应该对vxwidget托管指针.TL使用智能指针;Drand Debug是围绕异步框架中悬空引用问题而工作的,它将对象的删除延迟到可以安全地进行的点。C++是一个C++入门关键字,它涵盖了任何介绍性C++学习材料。我不知道Destroy是什么,但它可能包含在WxWidgets的文档中。Destroy是一个成员函数,你必须找到它才能看到它的作用。我不认为有理由否决这个问题。@Swardfish你的答案在这里不适用。问题是关于vxwidgets框架的,不应该对vxwidget托管指针.TL使用智能指针;DR Destroy是解决异步框架中悬空引用问题的一种方法,它将对象的删除延迟到可以安全完成的程度。如果在处理事件或创建嵌套事件循环的上下文中删除小部件,则与Qt的deleteLater类似。框架拥有对象的某些方面的所有权,在不从框架中删除所有悬空引用的情况下删除它是不正确的。该限制来自这样一个事实,即删除发生在可能存在指向已删除对象的引用或指针的缓存副本的上下文中。这是完全正确的,请注意,此解释并非来自,而是来自站点。如果在处理事件或创建嵌套事件循环的上下文中删除小部件,则类似于Qt的deleteLater。框架拥有对象的某些方面的所有权,在不从框架中删除所有悬空引用的情况下删除它是不正确的。这个限制来自这样一个事实,即删除发生在可能存在指向已删除对象的引用或指针的缓存副本的上下文中。这是完全正确的,请注意,此解释不是来自,而是来自站点。
#include "taskBarIcon.h"
class myApp: public wxApp{
public:
    // ....
private:
    CTaskBarIcon *m_pTaskbar; // = NULL
};
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();
}
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();
}
// app.cpp
int myApp::OnExit() {
    if (m_pTaskbar != NULL) {
        delete m_pTaskbar; // <-- The problem here
        m_pTaskbar = NULL;
    }
    return 0;
}