在对象被破坏后释放unique_ptr

时间:2016-04-16 01:22:56

标签: c++ unique-ptr

以下代码是否合法?我担心的是在.release方法中对象被破坏后使用Start方法。

class Foo
{
public:
    Foo()
    {
        std::cout << "Foo ctor\n";
    }

    ~Foo()
    {
        std::cout << "Foo dtor\n";
    }

    void Start()
    {
        std::unique_ptr<Foo> ptr(this);
    }
};

int main(int argc, char* argv[])
{
    auto ptr = std::make_unique<Foo>();
    ptr->Start();
    ptr.release();
}

我在vs12中试过这个并没有抱怨。

1 个答案:

答案 0 :(得分:2)

std :: unique_ptr是一个只有一个动作的指针的容器:删除它被销毁时引用的实例。 (或调用reset()时)

因此,只要未调用析构函数或重置函数,您就会拥有正在运行的代码。但是,如果重写Start()函数也会引发异常,则会发生崩溃。 (没有额外的捕获代码)另一个风险是你在程序中保留一个悬空指针,你必须注意。

所以是的,您的代码是合法且有效的,但我不推荐它,因为它容易出错。我宁愿建议写一些类似的东西:

static void Start(std::unique_ptr<Foo> &&owner)
{
std::unique_ptr<Foo> ptr(std::move(owner));
}

或者如果你真的需要这个方法的所有权(让我们考虑线程),使它成为一个std :: shared_ptr并分享所有权:

class Foo : std::enable_shared_from_this<Foo>
{
     void Start()
     {
     std::shared_ptr<Foo> ptr = shared_from_this();
     }
}