与std :: unique_ptr相关的错误

时间:2014-07-11 10:24:06

标签: c++ c++11 unique-ptr object-lifetime

我遇到了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会清除错误。

请有人解释。

2 个答案:

答案 0 :(得分:4)

std::unique_ptr用于管理动态分配对象的生命周期(即使用new等创建的对象)。

在您失败的示例中,foo是使用自动存储创建的,因此无需管理其生命周期(并且尝试这样做会导致您观察到的错误)。一旦超出范围,编译器将自动销毁它。

答案 1 :(得分:3)

当你这样做时

Foo foo;
X x(&foo);

foo在堆栈中分配。堆栈中的对象不能包含在unique_ptr中。只有当对象在堆中时才能执行此操作:

Foo* foo = new Foo( );
X x( foo );