【发布时间】:2014-07-11 10:24:06
【问题描述】:
我遇到了 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 会清除它。
请有人解释一下。
【问题讨论】:
-
除了 ComicSansMS 的答案,您不需要将
m_foo初始化为nullptr,然后为其分配一个新构造的std::unique_ptr<Foo>。您可以立即使用正确的指针初始化m_foo,分别使用m_foo(new Foo())和m_foo(foo)。显式成员初始化器的全部意义在于避免成员构造跟随赋值反模式。
标签: c++ c++11 unique-ptr object-lifetime