2016-02-22 55 views
-2

我的C++代碼有簡單(我想)的問題。每次我初始化的unique_ptr通過構造我得到了同樣的問題:通過構造函數初始化C++ unique_ptr

munmap_chunk():無效的指針:0x00007ffc40ba6bf0

下面的代碼:

1)的私處該類:

template<typename T> 
class Node{ 
    typedef std::unique_ptr<Node> ptr; 
    T value; 
    ptr left, right; 

2)構造函數初始化ptr left和ptr right:

explicit Node(const T value, Node* left = nullptr, Node* right = nullptr): 
    value{value}, left{left}, right{right} {} 

這裏有什麼問題?感謝您的澄清或指引我朝着正確的方向發展。

+2

應該可能是'顯式節點(const T值,ptr left = nullptr,ptr right = nullptr):value {value},left {std :: move(left)},right {std :: move(正確)} {}'。 – Jarod42

+2

這段代碼沒有問題,雖然傳入原始指針並不理想。實際的問題必須在別的地方;我懷疑你是在釋放這些指針。 –

+3

@ Jarod42'move'對原始指針沒有任何作用。 –

回答

3

從您的評論例initizalization:

Node<int> node(12); 
Node<int> node2(15, &node); 

顯然會崩潰,因爲你通過一個自動變量(node)的地址轉換成​​,其在它的破壞將嘗試delete它,甚至儘管它從未被分配到new

使用​​只能對堆中的對象*

(從這項工作的另一個教訓:永遠把MCVE,這是保證包含的問題,而你的代碼沒有。)!

*除非您知道自己在做什麼,即如果delete對於您的類型過載或者您將適當的刪除程序傳遞給unique_ptr

+0

'unique_ptr'不僅僅適用於堆對象。默認情況下,它使用'delete'關鍵字,對於某些類型,它也可以被覆蓋;此外,它可以使用自定義刪除器。 –

+0

@YamMarcovic是的,你可以做所有這些,但比這個用戶更先進。我會改變我的答案提到這一點。 – Walter

+0

謝謝你的提示,一定會記住那些,讚賞和抱歉重複。 – xxxxx