我遇到了std :: unique_ptr的问题。我以为我明白了,但显然不是。
我有以下代码:
X::X() : m_foo(nullptr),
{
m_foo = std::unique_ptr<Foo>(new Foo());
}
X::X(Foo* foo) : m_foo(nullptr),
{
m_foo = std::unique_ptr<Foo>(foo);
}
std::unique_ptr<Foo> m_foo;
当我按如下方式构造X时:
Foo foo;
X x(&foo);
我在运行时收到错误,告诉我'对象0x101f7eec0的错误:释放的指针未被分配'。
但是,当我按如下方式构造X时:
Foo foo;
X x;
没有发生此类错误。
如果我添加以下析构函数:
X::~X()
{
m_foo.release();
}
一切正常。
我不确定为什么错误发生在第一位,也不是为什么释放foo会清除错误。
请有人解释。
答案 0 :(得分:4)
std::unique_ptr
用于管理动态分配对象的生命周期(即使用new
等创建的对象)。
在您失败的示例中,foo
是使用自动存储创建的,因此无需管理其生命周期(并且尝试这样做会导致您观察到的错误)。一旦超出范围,编译器将自动销毁它。
答案 1 :(得分:3)
当你这样做时
Foo foo;
X x(&foo);
foo在堆栈中分配。堆栈中的对象不能包含在unique_ptr中。只有当对象在堆中时才能执行此操作:
Foo* foo = new Foo( );
X x( foo );