std :: unique_ptr的延迟初始化

时间:2014-03-20 01:42:56

标签: c++ c++11 smart-pointers

我有一个std::unique_ptr成员的类,最初初始化为nullptr,后来分配了一个实际对象。他们还使用自定义删除器。

关于这种情况,我有两个问题:我应该使用std::unique_ptr::reset()还是复制赋值运算符来为首先初始化为nullptr的唯一指针赋值?如果是后者,那么我如何使下面的代码工作?

class MyClass {
private:
    std::unique_ptr<Foo, void(*)(Foo*)> m_foo;
    std::unique_ptr<Bar, void(*)(Bar*)> m_bar;
}

MyClass::MyClass() : m_foo(nullptr, ReleaseFoo), m_bar(nullptr, ReleaseBar) { }

bool MyClass::init()
{
    m_foo.reset(CreateFoo()); // works ok
    m_bar = std::unique_ptr<Bar, ReleaseBar>(CreateBar()); // 'ReleaseBar' is not a valid template type argument for parameter '_Dx'
}

另外,如果没有涉及自定义删除器,答案是否会改变(例如,使用自定义删除器重置和复制分配)?

1 个答案:

答案 0 :(得分:2)

您可以使用reset移动赋值运算符来指定新值。

您的陈述存在问题

m_bar = std::unique_ptr<Bar, ReleaseBar>(CreateBar()); // 'ReleaseBar' is not a valid template type argument for parameter '_Dx'

是,如您引用的错误消息所示,ReleaseBar不是有效的模板参数。早期代码使用ReleaseBar的方式与此函数名称一致。在早期的代码中,相应的模板参数为void(*)(Bar*)