我有这样一类树节点称为Message
,看起来像这样:this指针QSharedPointer
class Message
{
public:
using Ptr = QSharedPointer<Message>;
public:
explicit Message();
explicit Message(Message::Ptr parentPtr);
explicit Message(const Data &data, Message::Ptr parentPtr = Message::Ptr());
void setParent(Message::Ptr parentPtr);
Message::Ptr parent() const;
bool hasParent() const;
QSet<Message::Ptr> children() const;
void setChildren(const QSet<Message::Ptr> &children);
bool hasChildren() const;
Data data() const;
void setData(const Data &data);
private:
void addChild(Message::Ptr childPtr);
void removeChild(Message::Ptr childPtr);
private:
Message::Ptr m_parentPtr;
QSet<Message::Ptr> m_children;
Data m_data;
};
这个类可以有一个父和一组孩子。我有一个问题,当我实现了addChild
和setParent
成员函数:
void Message::addChild(Message::Ptr childPtr)
{
if (!m_children.contains(childPtr)) {
m_children.insert(childPtr);
}
Message::Ptr thisPtr(this);
if (childPtr->parent() != thisPtr) {
childPtr->setParent(thisPtr);
}
}
void Message::setParent(Message::Ptr parentPtr)
{
if (m_parentPtr != parentPtr) {
m_parentPtr = parentPtr;
m_parentPtr->addChild(Message::Ptr(this));
}
}
我预计会发生:
Message::addChild
被称为thisPtr
得到为1的引用计数创建childPtr->parent() != thisPtr
将解析为true
childPtr->setParent(thisPtr);
,Message::setParent
被执行并且thisPtr
引用计数将随着创建共享指针的副本而增加1。现在thisPtr
具有2- 作为
Message::setParent
被执行,引用计数m_parentPtr = parentPtr;
将增加1m_parentPtr
,parentPtr
因此thisPtr
引用计数;这些3个智能指针现在有3 - 执行的引用计数退出
Message::setParent
和破坏parentPtr
由1 - 执行返回递减的
m_parentPtr
和thisPtr
引用计数Message::addChild
。现在参考thisPtr
数为2
实际发生的:
当执行1退出在Message::addChild
thisPtr
引用计数if
声明再次降低,留下thisPtr
与1这是一个引用计数当执行存在时会使所有内容破坏Message::addChild
,thisPtr
被破坏,因此this
被删除。
我的问题:
为什么thisPtr
引用计数通过在执行退出在Message::addChild
的if
陈述或实际发生的情况有再次下降...
你不能只将'* this'的所有权移交给'QSharedPointer'(你甚至可以多次执行)。阅读[文档](http://doc.qt.io/qt-5/qsharedpointer.html#QSharedPointer-1)。 – molbdnilo
哇,这是一个恼人的动画 - 你不能把它放到文本形式吗? –
@JesperJuhl嗯,这正是我在7点上做的*我期望会发生什么* ... –