[英]shared_ptr - why does it break?
在開發樹狀數據結構時,我寫了這樣的內容:
#include <memory>
class Node: public std::enable_shared_from_this<Node> {
public:
void set_root(Node & n);
private:
std::shared_ptr<Node> root;
std::shared_ptr<Node> leaf;
};
void Node::set_root(Node & n) {
root = n.shared_from_this();
n.leaf = shared_from_this();
}
int main() {
Node n1, n2;
n1.set_root(n2);
}
代碼使用clang編譯,但是會中斷運行時間(“ libc ++ abi.dylib:以類型為std :: __ 1 :: bad_weak_ptr:bad_weak_ptr的未捕獲異常終止)”為什么?
編輯因此,基於答案,我想出了一個似乎可行的版本:
#include <memory>
class Node;
typedef std::shared_ptr<Node> Node_SP;
class Node: public std::enable_shared_from_this<Node> {
public:
void set_root(Node & n);
private:
std::shared_ptr<Node> root;
std::shared_ptr<Node> leaf;
};
void Node::set_root(Node & n) {
root = n.shared_from_this();
n.leaf = shared_from_this();
}
int main() {
Node_SP n1 = std::shared_ptr<Node>(new Node);
Node_SP n2 = std::shared_ptr<Node>(new Node);
n1->set_root(*n2);
}
為此, enable_shared_from_this<Node>
必須為其自身存儲一個weak_ptr<Node>
。 默認情況下,將該weak_ptr
構造為null。 當shared_ptr
被構造為接管對象的所有權時(無論是make_shared
還是通過傳遞原始指針),它會將所述weak_ptr
設置為引用該新的shared_ptr
。 如果然后在對象上調用shared_from_this()
,則weak_ptr
會被lock
並且可以返回另一個shared_ptr
。
但是,在您的情況下,沒有shared_ptr
n1
和n2
shared_ptr
,因此在調用shared_from_this()
, lock
將在null的weak_ptr
上執行,從而導致上述異常。
長話短說 :不要在不是shared_ptr
擁有的對象上調用shared_from_this()
,尤其是在您的示例中,不要在基於堆棧的對象上調用。
shared_ptr
假定對象是在堆上分配的,但是您已經在堆棧上分配了它。
請改用new
並讓shared_ptr
調用delete
為您。
在對象t上調用shared_from_this之前,必須有一個擁有t的std :: shared_ptr。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.