2016-11-28 91 views
0

我正在用C++做一個學校作業(我還在學習)。我試圖實現隨機生成的二叉樹結構,使用shared_ptr在多個地方存儲節點的信息(我需要作業)。考慮下面的示例代碼(這是我的小測試程序):C++:shared_ptr在向量中沒有更新原始的shared_ptr

#include <vector> 
#include <memory> 


struct Node : public std::enable_shared_from_this<Node> { 
    char charValue; 
    int intValue; 
    std::shared_ptr<Node > left; 
    std::shared_ptr<Node > right; 
    std::shared_ptr<Node > parent; 

    std::shared_ptr<Node> getPtr() 
    { 
     return shared_from_this(); 
    } 

    Node() : intValue(0) 
    { 
     charValue = 0; 
    } 
}; 

int main(int argc, char**argv) { 

    std::vector<std::shared_ptr<Node>> treeQueue; 
    std::shared_ptr<Node> root = std::make_shared<Node>(); 

    treeQueue.clear(); 
    treeQueue.push_back(root->left); //std::shared_ptr<Node>(root->left)); //root->left->getPtr()); 
    treeQueue.push_back(root->right); //std::shared_ptr<Node>(root->right)); //root->right->getPtr()); 

    treeQueue[1] = std::make_shared<Node>(); //std::shared_ptr<Node>(new Node); 
    system("PAUSE"); 

    return 0; 
} 

在這種情況下,我intialize的根,我想保持樹的所有其他節點空的,直到我在樹結構中選擇它。在我的作業中,我決定在矢量treeQueue中將它推向哪個節點。 (我從那裏隨機挑選它)。

問題:例如,在上面的代碼中,當我初始化treeQueue [1]時,我期望root-> right也被初始化。因爲他們是相同的指針。但它保持空虛!我還提出了其他方法,我嘗試在treeQueue中推送它(這也不起作用)。我也嘗試過「enable_shared_from_this」,這就是爲什麼它在那裏。

有沒有辦法做到這一點?還是有另一種技術可以提供我需要的相同功能?

我知道使用原始指針並不健康,所以我使用了shared_ptr,這有道理,但現在我得到了這個問題。請幫助我,我會失去理智。我可以到處搜索。我嘗試了我發現的一切。

+0

爲什麼期待'root-> right'被初始化?你沒有在任何地方初始化它。 – lcs

+0

'treeQueue [1] = std :: make_shared ()'不影響'root-> right',你只需要用一個新值刪除一個空的'shared_ptr'(拷貝'root-> right')。你可能需要'std :: vector *>'... – Jarod42

+0

我不明白你的問題。你想達到什麼目的? – Barry

回答

0

感謝Sam Varshavchik讓我明白自己的錯誤。我最終也採取了Jarod42的建議和使用treeQueue作爲

std::vector<std::shared_ptr<Node>*> 

它的工作。所以我將這個評論標記爲解決方案,作爲對這兩條評論的參考:)

3

shared_ptr共享ptr指向的內容。 shared_ptr本身不以任何方式,形狀,物質或形式「共享」。每個引用相同對象(即共享對象)的shared_ptr是它自己的單獨的離散共享指針。

在這裏,您將一個shared_ptr複製到另一個shared_ptr。然後你用另一個新建的shared_ptr替換了shared_ptr的副本。

新構建的shared_ptr與原始shared_ptr沒有任何關係,第一個從複製的第一個引用。

您的代碼等同於以下內容:

int *a=NULL; 

int *b=a; 

b=new int{4}; 

你期望的那樣,現在,*a回到4?當然不是。他們是兩個完全不同的指針。

+0

哦,我明白了,謝謝。你可以提出任何方法來完成這個呢? –

+1

你應該在'Node()'的構造函數中初始化左/右。但是你會遇到另一個問題:如果你創建一個完全由'shared_ptr's鏈接的樹(無論它是在構造函數中完成的,還是手動完成的),你將創建一個循環引用(父和子之間),這將導致在內存泄漏。現在您已經瞭解了'shared_ptr'的全部內容,您還需要了解弱指針的含義。 –