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

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

但是,指针似乎不再有效,因此我无法使用它来删除分配的内存。

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

难道不是这样吗?

最佳答案

问题是您正在创建一个局部变量,该变量恰好与您在类中使用的名称相匹配。

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

这里的cl_LogStore和成员变量cl_LogStore不一样。它是一个局部变量。因此,您不仅对无效的指针值调用了delete,而且还发生了内存泄漏。

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

相关文章:

c++ - 在链表中添加字符串的简单方法

python - 任务栏和可点击应用程序图标之间的图标不匹配

linux - 从 Linux 切换到 Windows 时的字符编码

c++ - 如何在 wxStatusBar 中设置图像?

c++ - 如何在我的vs2010项目中使用wxformbuilder生成的c++文件

C++ 网络套接字、SCTP 和数据包大小

c++ - 我可以从 nullptr 构造一个 string_view 吗?

c++ - 如何将MAC地址转换为对应的IP地址?

linux - 如何为window建立一个基于linux的程序?

python - Mac OS X 上的 wxPython 2.9