显式删除和新增vs使用unique_ptr

时间:2015-05-19 15:46:55

标签: c++ smart-pointers unique-ptr delete-operator

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

  1. 使用显式删除。
  2. 通过创建将删除对象的unique_ptr。
  3. 同样的问题也是对象的创建 - 我应该使用new还是创建unique_ptr并立即释放它。

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

    VS

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

1 个答案:

答案 0 :(得分:4)

都不是。

你应该这样做......

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进入lambda捕获。

你也可以省略p.reset()并让指针在lambda死亡时死亡,我认为(取决于AsyncFunc)就在lambda被调用之后。