2013-07-30 190 views
1

有一些函數使用void *作爲它們的參數,在這種情況下如何將智能指針傳遞給它?如何將智能指針作爲void *傳遞給函數?

比如我有

gboolean callback(gpointer arg); // might delete arg when it finish 

A *mydata = new A(); 
gpointer parg = (gpointer)mydata; 
g_timeout_add(100, callback, parg); 

,如果我在這裏使用智能指針:

std::shared_ptr<A> mydata(new A()); 

如何將它轉化成的g_timeout_add(.., void*) ARG?

+2

'mydata.get()'。 – 0x499602D2

+1

如果回調刪除了你的指針,那麼你有麻煩了。 –

+3

確保您永遠不會將指針傳遞給可能會刪除指針的函數。當智能指針被破壞時,它也會刪除指針,這是未定義的行爲。 –

回答

4

我從你的標題中可以看出gpointer實際上是void*。在這種情況下,我還會假設,當你說might delete arg when it finish時,你的確意思是free(),因爲一旦你拋棄了原來的類型,你不能保證delete是合法的。

在這種情況下,在任何情況下都不應該使用智能指針傳遞給g_timeout_add調用,因爲它可能會導致回調和智能指針都刪除相同的內存,這會導致未定義的行爲。

您需要決定誰擁有mydata:調用者,回調或共享。然後基於此,您可以實現調用者/回調代碼以正確表示這些所有權語義。

+0

謝謝。可悲的是,在這種情況下,我需要明確地調用'delete' /'free',我想我可以以某種方式使用智能指針來避免潛在的內存泄漏。 – Deqing