Не удается удалить динамический объект, созданный в wxApp, из OnExit ()

#c #windows #wxwidgets

#c #Windows #wxwidgets

Вопрос:

Я пытаюсь понять, как должно быть разработано приложение wxWidgets (3.0.1), но мне чего-то не хватает, поскольку то, что я пытаюсь, не работает.

На базовом уровне у меня есть мой wxApp, он создает wxFrame, он отображается, и все работает нормально. Затем я решил добавить объект logger….

Я сделал объект членом моего wxApp:

 class IniLogWx : public wxApp
{
    public:
        virtual bool            OnInit( );  
        virtual int             OnExit( );  

    private:
        cLogStore *             cl_LogStore;
};
 

И инициализировал его в wxApp::OnInit()

 bool IniLogWx::OnInit( )
{
    MainFrame * frame = new MainFrame(_("Log Demo"), wxPoint(250, 250), wxSize(450, 340));
    frame->Show(true);
    SetTopWindow(frame);

    // Create Logger Class
    cLogStore * cl_LogStore = new cLogStore( );

    return true;
}
 

Когда приложение закрывается (закрывает мэйнфрейм) срабатывает wxApp ::OnExit(), и я подумал, что смогу очистить свою память здесь

 int IniLogWx::OnExit( )
{
    delete cl_LogStore; // Unhandled Exception here due to invalid pointer

    return wxApp::OnExit();
}
 

Однако может показаться, что указатель больше недействителен, поэтому я не могу использовать его для удаления назначенной мне памяти.

В руководстве говорится: «OnExit вызывается после уничтожения всех окон и элементов управления приложения, но перед очисткой wxWidgets». поэтому я решил, что мои собственные дополнительные атрибуты все равно будут доступны для меня.

Разве это не так?

Ответ №1:

Проблема в том, что вы создаете локальную переменную, которая совпадает с именем, которое вы использовали в своем классе.

 // Create Logger Class
cLogStore * cl_LogStore = new cLogStore( );
 

cl_LogStore Здесь не совпадает с переменной-членом cl_LogStore . Это локальная переменная. Таким образом, вы не только вызвали delete недопустимое значение указателя, у вас произошла утечка памяти.

Комментарии:

1. Я не верю, что я это пропустил! Это действительно то, где я ошибался. Большое спасибо.