2015-05-19 65 views
1

我有一个回调传递给一个异步函数,它只负责删除传递给异步函数的指针。 如何删除指针:显式删除和新vs使用unique_ptr

  1. 通过使用显式删除。
  2. 通过创建将删除对象的unique_ptr。

对于创建对象也有同样的问题 - 我应该使用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;)} 
+0

什么是'AsyncFunc'声明? –

+0

如果'AsyncFunc'取得了'myClass'的内存所有权,那么它理想情况下应该接受一个'std :: unique_ptr '来在语义上表明它是这样做的。在这种情况下,您不需要传递回调来删除指针,只要'AsyncFunc'完成使用它就会被删除。然而,没有更多的信息,很难确定你想要达到的目标。 –

+0

我认为不需要显式删除。我想知道你想要做什么。在传递给异步删除之前,该指针如何被创建和使用是很重要的。 std :: auto_ptr会做得很好。我认为你是从错误的一面解决它。从一开始就开始。 – Pihhan

回答

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 

这样你永远不会通过原始指针持有股权(其中,你不应该这样做),以及拉姆达有myClass所有权,因为它已经move d进入lambda捕获。

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

+1

这听起来并不像是他希望传递一个异步运行的函数,它听起来像'AsyncFunc'异步执行某些未指定的工作,并且他希望一个函数调用以后清理内存,在这种情况下,他需要的只是一个'std :: unique_ptr'。尽管如此,很难说出他想要做什么。 –

+0

@David噢,我明白了,是的,我同意所有观点 - 这取决于他正在尝试做什么。目前尚不清楚。 – David

+0

C++ 11支持这种语法吗?它看起来只支持在C++ 14中,我需要使用C++ 11。 – user844541