使用unique_ptr显式delete和new vs

Explicit delete and new vs using a unique_ptr

本文关键字:new vs delete 显式 unique ptr 使用      更新时间:2023-10-16

我有一个传递给async函数的回调,它只负责删除传递给async函数的指针。如何删除指针:

    通过创建一个unique_ptr来删除对象。

同样的问题也适用于对象的创建——我应该使用new还是创建一个unique_ptr并立即释放它?

MyClass* myClass = make_unique<MyClass>().release();
AsyncFunc(myClass, [myClass](){std::unique_ptr<MyClass>(myClass)}

MyClass* myClass = new MyClass();
AsyncFunc(myClass, [myClass](){delete myClass;)}

都不是

你应该这样做…

auto myClass = make_unique<MyClass>();
// hand out pointers to myClass by using myClass.get() as needed
AsyncFunc([p = std::move(myClass)]{ p.reset(); });
// make sure any pointers to myClass you handed out are unused/gone
// by the time the async func is called

这样,你永远不会通过原始指针持有所有权(这是你永远不应该做的),并且lambda拥有myClass的所有权,因为它已经被move d进入lambda捕获。

您也可以省略p.reset()并在lambda死亡时让指针死亡,我假设(取决于AsyncFunc)是在lambda被调用之后立即死亡。