以下代码是否合法?我担心的是在.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中试过这个并没有抱怨。
答案 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();
}
}