簡體   English   中英

shared_ptr-為什么會中斷?

[英]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 n1n2 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.

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