我试图了解应如何设计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。”因此我认为自己仍然可以使用自己的其他属性。

不是这样吗?

最佳答案

问题是您正在创建一个与您在类(class)中使用的名称相匹配的局部变量。

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

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

关于c++ - 无法从OnExit()中删除在WxApp中创建的动态对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24446804/

10-11 18:45