#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. Я не верю, что я это пропустил! Это действительно то, где я ошибался. Большое спасибо.