无法从OnExit()删除在WxApp中创建的动态对象

时间:2014-06-27 07:58:52

标签: c++ windows wxwidgets

我正在尝试理解应该如何设计WxWidgets(3.0.1)应用程序,但是我错过了一些我正在尝试的东西不起作用。

在基础级别,我有我的WxApp,它会创建一个WxFrame,它会显示出来并且一切正常。 然后我决定添加一个记录器对象....

我让对象成为我的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;
}

当应用程序关闭(关闭MainFrame)时,WxApp :: OnExit()会触发,我想到我可以在这里清理我的内存

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

    return wxApp::OnExit();
}

但是,看起来指针不再有效,所以我不能用它来删除我分配的内存。

手册说“在销毁所有应用程序窗口和控件之后,但在wxWidgets清理之前调用OnExit。”所以我认为我自己的额外属性仍然可供我使用。

情况不是这样吗?

1 个答案:

答案 0 :(得分:4)

问题在于您创建的本地变量恰好与您在班级中使用的名称相匹配。

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

cl_LogStore此处与成员变量cl_LogStore不同。这是一个局部变量。因此,您不仅在无效指针值上调用delete,而且还有内存泄漏。