【问题标题】:WxWidgets Sizer Double Frees?WxWidgets Sizer 双倍免费?
【发布时间】:2020-09-10 16:34:32
【问题描述】:

我将在这个问题的开头说我对 wxWidgets 并不完全陌生,尽管我也不认为自己拥有所有这些经验。

我遇到了一个问题,我通过测试将其范围缩小到使用 wxWidgets wxBoxSizer 类。据我所知,我不认为我做错了什么,并且它们在应用程序运行时工作;然而,当应用程序关闭并且一切都终止时,似乎大约有三分之一的时间它会双重释放某些东西并出现段错误。我在 linux 系统上编写和构建,除了这些 sizer 之外似乎没有任何问题。

在我剥离 HomeFrame 类以搜索错误之前,我确实在 HomeFrame 类中有更多窗口,但下面的代码仍然会导致双重释放:

我还查看了 StackOverflow 和其他代码论坛,看看是否有人遇到类似问题,但我找不到任何东西。我在想这可能与我将sizer指针作为成员存储在类中的方式有​​关?

HomeFrame.h:

#pragma once

#include <wx/frame.h>
#include <wx/sizer.h>

namespace qzrgui
{
    class HomeFrame: public wxFrame
    {
    public:
        HomeFrame();
        ~HomeFrame();

    private:
    //  Sizers

        wxBoxSizer* _topSizer;
        wxBoxSizer* _leftSizer;
        wxBoxSizer* _rightSizer;

    //  Functions

        void _setup();
        void _createWindows();
    };
}

HomeFrame.cpp:

#include "HomeFrame.h"

namespace qzrgui
{
    HomeFrame::HomeFrame() :
    wxFrame(nullptr, wxID_ANY, "Quizzer")
    {
        _setup();
    }
    
    HomeFrame::~HomeFrame() 
    {
        
    }
    
    void HomeFrame::_createWindows() 
    {
    //  Create sizers.

        _topSizer = new wxBoxSizer(wxOrientation::wxHORIZONTAL);
        _leftSizer = new wxBoxSizer(wxOrientation::wxVERTICAL);
        _rightSizer = new wxBoxSizer(wxOrientation::wxVERTICAL);
    }
    
    void HomeFrame::_setup() 
    {
        _createWindows();
    }

}

Quizzer.h(wxApp 基类):

#pragma once

#include <wx/app.h>


namespace qzrgui
{
    class Quizzer : public wxApp
    {
    public:
        virtual bool OnInit();
    };
};


Quizzer.cpp:

#include "Quizzer.h"

wxIMPLEMENT_APP(qzrgui::Quizzer);

#include "frames/HomeFrame.h"

namespace qzrgui
{
    bool Quizzer::OnInit()
    {
        wxFrame* frame = new HomeFrame();
        frame->Show(true);

        return true;
    }
}

【问题讨论】:

  • 你需要将sizer存储为成员吗?另外,您使用哪个 wx 版本以及在哪个平台下使用?
  • 你的班级违反了 3/5/0 的规则:https://en.cppreference.com/w/cpp/language/rule_of_three
  • 我假设您在未显示的代码中某处有删除。
  • @Igor 我想我不需要这样做,但我在构建课程时这样做是出于组织目的。我不认为它会改变什么。我在 Ubuntu Linux 上使用 wxWidgets 3.1.4。
  • @drescherjm 我知道,这个类只是为了演示目的。我定义了析构函数,因为我在里面乱搞终止的东西,看看我是否能理解正在发生的事情。

标签: c++ wxwidgets


【解决方案1】:

此处显示的代码中没有任何内容可能导致崩溃。您的代码中确实存在(三个)内存泄漏,因为您创建了 3 个与任何窗口或其他 sizer 无关的 sizer,并且永远不会删除它们,但是,虽然错误,但这不会导致崩溃。

也没有足够的信息来诊断您所看到的。与崩溃一样,请使用调试信息构建代码并在调试器下运行它以查看究竟发生了什么。如果您在类 Unix 系统下(或者甚至在具有最新 MSVS 2019 版本的 MSW 下),您还应该在启用地址清理器的情况下进行编译,以便在崩溃发生之前找到真正的问题。 p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多