Я не могу удалить переменную-член класса wxApp - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть CTaskBarIcon *m_pTaskbar переменная-член в классе myApp.
Эта переменная будет иметь экземпляр объекта CTaskBarIcon. При удалении m_pTaskbar из метода onExit возникает ошибка времени выполнения при выходе из программы, и причиной проблемы является удаление переменной m_pTaskbar.

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

CTaskBarIcon::CTaskBarIcon(mainFrm *handler) : m_pHandler(handler), m_pMenu(NULL) {
    this->Bind(wxEVT_TASKBAR_CLICK, &CTaskBarIcon::rightButton_Click, this);
}

CTaskBarIcon::~CTaskBarIcon() {
    if (m_pMenu != NULL) {
        delete m_pMenu;
        m_pMenu = NULL;
    }
}


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();
}

wxMenu* CTaskBarIcon::CreatePopupMenu() {
    this->m_pMenu = new wxMenu();
    m_pMenu->Append(wxID_SHOW, "&Show");
    m_pMenu->Append(wxID_ABOUT, "&About");
    m_pMenu->Append(wxID_EXIT, "E&xit");
    m_pMenu->Bind(wxEVT_MENU, &CTaskBarIcon::popupMenu_showWindow, this, wxID_SHOW);
    m_pMenu->Bind(wxEVT_MENU, &CTaskBarIcon::popupMenu_showAbout, this, wxID_ABOUT);
    m_pMenu->Bind(wxEVT_MENU, &CTaskBarIcon::popupMenu_exit, this, wxID_EXIT);
    return this->m_pMenu;
}

Есть ли проблема с моим кодом?

1 Ответ

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

Может быть проблема с удалением wxTaskBarIcon из его собственного обработчика событий. Можете ли вы попробовать, если использование CallAfter([this] { Destroy(); }) вместо простого вызова Destroy() напрямую решит проблему?

...