2015-01-12 135 views
0

這是我的代碼,我將值賦給樹的節點。我能夠很好地分配,直到樹的左右孩子。但是,當我嘗試使用左 - >左的孩子的根,它會給我訪問衝突錯誤。爲什麼代碼在使用unique_ptr時崩潰,原始指針工作正常?

Trees.exe中的0x00DE5CC3未處理的異常:0xC0000005:訪問 違規讀取位置0x00000004。

準確的錯誤在線,unique_ptr<node> (r->left->left) = newNode(4);

我使用unique_ptr,如果我使用原始指針,一切都按預期工作。

以下是我的代碼,

using std::cout; 
using std::endl; 
using std::unique_ptr; 


struct node 
{ 
    int data; 
    node * left; 
    node * right; 
}; 

unique_ptr<node> newNode (int i) 
{ 
    unique_ptr<node> n (new node); 
    n->data = i; 
    n->left = nullptr; 
    n->right = nullptr; 

    return n; 
} 

int main(int argc, char* argv[]) 
{ 
    unique_ptr<node> r = newNode(1); 
    unique_ptr<node> (r->left) = newNode(2); 
    unique_ptr<node> (r->right) = newNode(3); 
    unique_ptr<node> (r->left->left) = newNode(4);//this line craches 
    unique_ptr<node> (r->left->right) = newNode(5); 
    return 0; 
} 

回答

9
unique_ptr<node> (r->left) = newNode(2); 

這不會做你彷彿覺得它(儘管這很難說,你想象一下這是做的正是)。這是發生了什麼:

  1. 臨時unique_ptr構造,與r->left(目前nullptr)的值初始化。

  2. 這個臨時的unique_ptr被重新分配,現在持有由newNode(2)返回的值。

  3. 在分號處,臨時被破壞;它的析構函數刪除它所持有的指針。

最後,這條線是一個複雜的無操作。它分配一塊內存,然後立即釋放它。 r->left沒有以任何方式修改,並且仍然是nullptr

然後,r->left->left崩潰,因爲您試圖取消引用空指針。


如果你希望得到任何里程出unique_ptr,使node成員unique_ptr,如

struct node 
{ 
    int data; 
    unique_ptr<node> left; 
    unique_ptr<node> right; 
}; 
相關問題