[英]c++ segmentation fault when dereferencing a pointer to a vector of structures
[英]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_sidebar
是class 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.