【问题标题】:Segmentation fault when dereferencing pointer inside the destructor在析构函数内取消引用指针时出现分段错误
【发布时间】:2018-08-19 02:36:45
【问题描述】:

我有一个头文件part.h如下:

#ifndef _PART_H_
#define _PART_H_
#include <QPointer>
#include <QUrl>
class Sidebar;
class TOC;
namespace Okular
{
class OKULARPART_EXPORT Part : public KParts::ReadWritePart, public Okular::DocumentObserver, public KDocumentViewer, public Okular::ViewerInterface
{
    Q_OBJECT
    public:
        Part(QWidget* parentWidget, QObject* parent, const QVariantList& args);

        // Destructor
        ~Part();

    public:
        bool closeUrl() override;
        bool closeUrl(bool promptToSave) override;

    private:
        Sidebar * m_sidebar;
        QPointer<TOC> m_toc;
};
}
#endif

然后文件part.cpp为:

#include "part.h"
namespace Okular
{

Part::Part(QWidget *parentWidget,
QObject *parent,
const QVariantList &args)
: KParts::ReadWritePart(parent),
m_tempfile( nullptr ), m_documentOpenWithPassword( false ), m_swapInsteadOfOpening( false ), m_isReloading( false ), m_fileWasRemoved( false ), m_showMenuBarAction( nullptr ), m_showFullScreenAction( nullptr ), m_actionsSearched( false ),
m_cliPresentation(false), m_cliPrint(false), m_cliPrintAndExit(false), m_embedMode(detectEmbedMode(parentWidget, parent, args)), m_generatorGuiClient(nullptr), m_keeper( nullptr )
{
  // constructor code here

m_sidebar = new Sidebar( parentWidget );
    setWidget( m_sidebar );
}

Part::closeUrl(bool promptToSave)
{
m_sidebar->setCollapsed(promptToSave);
}

Part::~Part()
{
m_sidebar->setCollapsed(true); //segmentation fault
delete m_toc;
}
}//namespace Okular

在析构函数Part::~Part 中取消引用m_sidebar 时,我收到segmentation fault (core dumped) 错误。 m_sidebarclass Sidebar 类型的指针变量,在sidebar.cpp 中实现。 为什么我得到它,因为我认为 m_sidebar 不为空,因为它是在 Part::Part 构造函数中初始化的,它在 Part::closeUrl() 函数中工作。

【问题讨论】:

    标签: c++ qt destructor


    【解决方案1】:

    根据手册,当您将小部件传递给setWidget 时,您会将所有权传递给另一个小部件。你不应该尝试在析构函数中访问m_sidebar

    widget 成为滚动区域的子项,并在删除滚动区域或设置新的widget 时销毁。

    您可以订阅信号Sidebar::destroyed,并在此信号发出时重置m_sidebar = nullptr

    【讨论】:

    • 我没有在析构函数Part::~Part中删除m_sidebar。在响应Part 类析构函数之前是否有任何其他代码/类删除它?
    • 不要拘泥于文字。我觉得很明显m_sidebar已经被删除了,无法访问了。
    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多