簡體   English   中英

為什么我的 weak_ptr 出現分段錯誤

[英]Why am I getting segmentational fault with weak_ptr

我正在做一個練習來了解共享指針和弱指針。

所以這個例子是shared_ptr的循環依賴,我該如何解決weak_ptr的問題。

我想將 root->left->parent 初始化為 root,對於右節點也是如此,但它給了我分段錯誤。

有人知道這個問題,我應該如何編寫和初始化它?

這是我的代碼。

只是要知道,我的第一個練習是只使用共享指針來完成這一切,但之后將父級更改為weak_ptr,這就是為什么有注釋行

提前致謝

#include <iostream>
#include <memory>
#include <string>

using namespace std;

struct Node {
    string name;
    shared_ptr<Node> left = nullptr;
    shared_ptr<Node> right = nullptr;
//    shared_ptr<Node> parent=nullptr; 
    weak_ptr<Node> parent;
    
    Node(string x) : name(x) { cout << "Constructor" << name << endl; }
    ~Node() { cout << "Destructor " << name << endl; }

    string toString() {
        string lStr{ "<none>" }, rStr{ "<none>" }, pStr{ "<none>" }; 

        if (left != nullptr) lStr = left->toString();
        if (right != nullptr) rStr = right->toString();
        
//      if (parent != nullptr) pStr = parent->name; 
        pStr = parent.lock()->name; 

        string res;
        res += "{Me:" + name + " ";
        res += "Parent:" + pStr + " "; 
        res += "Left:" + lStr + " ";
        res += "Right:" + rStr + "}";
        return res;
    }
    
};


shared_ptr<Node> foo() {
    shared_ptr<Node> root = make_shared<Node>("rootname");
    root->left = make_shared<Node>("leftname");
    root->right = make_shared<Node>("rightname");
    
    root->left->parent = {root};
    root->right->parent ={root};
    
    return root;
}

int main()
{
    shared_ptr<Node> k = foo();
    cout << k->toString() << endl;
    return 0;
}
//      if (parent != nullptr) pStr = parent->name; 
        pStr = parent.lock()->name; 

應該

    if (auto parentPtr = parent.lock()) pStr = parentPtr->name; 

parent.lock()可能會返回 null std::shared_ptr

它在這一行崩潰:

pStr = parent.lock()->name;

因為parent節點沒有為根節點初始化。 我不知道你對根項的邏輯是什么,但你必須檢查鎖定的結果,如果它無效,用 pStr 做其他事情。

if (auto res = parent.lock()) {
    pStr = res->name;
} else {
    pStr = "root";
}

暫無
暫無

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

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