c++ - 与 std::unique_ptr 关联的错误

标签 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 会清除错误。

谁能解释一下。

最佳答案

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

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

关于c++ - 与 std::unique_ptr 关联的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24695525/

相关文章:

c++ - 有没有 C++ 引用手册 C :a reference manual?

c++ - 返回 *this C++

c++ - 竞争条件 : One thread creates static object, 另一个线程在完成初始化之前使用它。如何处理?

G++ 4.5 中 std::complex 的 C++11 复制赋值 - 与 'operator+' 不匹配

c++ - 如何使用共享指针作为函数参数

c++ - 在没有值初始化的情况下制作数组类型的 std::unique_ptr 的推荐方法?

c++ - 一旦代码进入另一个函数如何保留值

c++ - 从读入内存的文件中提取数据

c++ - 为什么 VS2013 在销毁唯一指针时抛出异常?

python - 将 unique_ptr 与 boost python 结合使用 - boost::shared_ptr 有效,但 unique_ptr 无效