2015-05-19 103 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