簡體   English   中英

在析構函數中取消引用指針時出現分段錯誤

[英]Segmentation fault when dereferencing pointer inside the destructor

我有一個頭文件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()函數中工作。

根據手冊,當您將小部件傳遞給setWidget ,您將所有權傳遞給另一個小部件。 您不應該嘗試在析構函數中訪問m_sidebar

該小部件成為滾動區域的子項,當滾動區域被刪除或設置新小部件時將被銷毀。

您可以訂閱信號Sidebar::destroyed並且當這個信號發出時重置m_sidebar = nullptr

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM