首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WxWidgets Sizer Double Frees?

WxWidgets Sizer Double Frees?
EN

Stack Overflow用户
提问于 2020-09-11 00:34:32
回答 1查看 41关注 0票数 0

我首先要说的是,我对wxWidgets并不完全陌生,尽管我也不会认为自己有过这样的经历。

我有一个问题,我已经通过测试缩小了与wxWidgets wxBoxSizer类有关的问题。据我所知,我不认为我做错了什么,它们在应用程序运行时工作;然而,当应用程序关闭,所有东西都终止时,似乎有大约三分之一的时间它会双重释放一些东西和seg错误。我正在linux系统上编写和构建,除了这些sizers之外,似乎没有任何问题。

在我剥离HomeFrame类来搜索bug之前,我确实在它里面有更多的窗口,但是下面的代码仍然导致了double-free:

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

HomeFrame.h:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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();
    }

}

H (wxApp基类):

代码语言:javascript
复制
#pragma once

#include <wx/app.h>


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

Quizzer.cpp:

代码语言:javascript
复制
#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;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-09-16 04:52:24

此处显示的代码中没有任何可能导致崩溃的内容。你的代码中肯定有三个内存泄漏,因为你创建了三个与任何窗口或另一个大小无关的大小,并且从不删除它们,但是,尽管是错误的,这也不会导致崩溃。

也没有足够的信息来诊断你所看到的。对于崩溃,请使用调试信息构建您的代码,并在调试器下运行它,以查看到底发生了什么。如果你在一个类Unix系统下(甚至是在最新MSVS 2019版本的MSW下),你也应该在编译时启用地址消毒器,以便在崩溃发生之前发现真正的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63834035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档