【发布时间】: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 我知道,这个类只是为了演示目的。我定义了析构函数,因为我在里面乱搞终止的东西,看看我是否能理解正在发生的事情。