C++ unique_ptr 通过构造函数初始化
C++ unique_ptr initialization through constructor
我的 C++ 代码有一个简单的(我想)问题。每次我通过构造函数初始化 unique_ptr 时,我都会遇到同样的问题:
munmap_chunk(): invalid pointer: 0x00007ffc40ba6bf0
代码如下:
1) class 的私有部分:
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} {}
这里有什么问题?感谢您的澄清或为我指明正确的方向。
来自您的评论示例初始化:
Node<int> node(12);
Node<int> node2(15, &node);
显然会崩溃,因为您将自动变量 (node
) 的地址传递给 unique_ptr<>
,它在销毁后会尝试 delete
它,即使它从未分配 new
.
仅对堆上的对象使用unique_ptr<>
!*
(这个练习的另一个教训:总是放一个 MCVE,保证包含问题,而你的代码没有。)
* 除非你知道你在做什么,即如果 delete
对你的类型来说是超载的,或者如果你将适当的删除器传递给 unique_ptr
。
我的 C++ 代码有一个简单的(我想)问题。每次我通过构造函数初始化 unique_ptr 时,我都会遇到同样的问题:
munmap_chunk(): invalid pointer: 0x00007ffc40ba6bf0
代码如下:
1) class 的私有部分:
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} {}
这里有什么问题?感谢您的澄清或为我指明正确的方向。
来自您的评论示例初始化:
Node<int> node(12);
Node<int> node2(15, &node);
显然会崩溃,因为您将自动变量 (node
) 的地址传递给 unique_ptr<>
,它在销毁后会尝试 delete
它,即使它从未分配 new
.
仅对堆上的对象使用unique_ptr<>
!*
(这个练习的另一个教训:总是放一个 MCVE,保证包含问题,而你的代码没有。)
* 除非你知道你在做什么,即如果 delete
对你的类型来说是超载的,或者如果你将适当的删除器传递给 unique_ptr
。