2016-02-22 54 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