std::unique_ptr相关错误

Error associated with std::unique_ptr

本文关键字:错误 unique std ptr      更新时间:2023-10-16

我有一个问题与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会清除它。

谁能解释一下

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

在你失败的例子中,foo是用自动存储创建的,所以没有必要管理它的生命周期(无论如何尝试这样做都会导致你观察到的错误)。一旦超出作用域,编译器会自动销毁它。

当你这样做的时候

Foo foo;
X x(&foo);

foo在堆栈中分配。栈中的对象不能包含在unique_ptr中。只有当对象在堆中时才可以这样做:

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