2012-03-28 101 views
3

經過大約10年的使用託管內存和函數式語言,我終於回到了C++,智能指針讓我感到困惑。有一半的文件仍然與已棄用的auto_ptr有關。unique_ptr與期望原始指針的API?

我想實現這個非常簡單的子彈"hello world"程序:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    auto bp = unique_ptr<btBroadphaseInterface>(new btDbvtBroadphase); 
    auto cc = unique_ptr<btDefaultCollisionConfiguration>(new btDefaultCollisionConfiguration); 
    auto disp = unique_ptr<btDispatcher>(new btCollisionDispatcher(cc)); 
} 

btCollisionDispatcher構造想要一個btCollisionConfiguration*,但我給它一個unique_ptr一個來代替。

在這種情況下,我通常要做什麼?如果有一種方法可以「清理」指針,某事告訴我unique_ptr不是正確的智能指針。

enter image description here

C++是我的首選語言之前,我搬到其他的事情。看到所有的模式和實踐已經完全改變,這有點令人震驚。

+0

我認爲答案取決於'btCollisionDispatcher'是否希望*共享*所有權或將*所有權?如果後者 - 你能否改變它來接受'unique_ptr'?如果是前者,則必須將其更改爲'shared_ptr'並將其傳入。 – Nim 2012-03-28 13:32:37

+0

'disp'將保存到'cc'並使用它,直到它被破壞。它預計你會在其他地方使用它,就像稍後我調用'btWorld'構造函數時那樣,但它不會在我自己的範圍之外共享指針。 – 2012-03-28 13:36:10

+0

它可能與您的問題沒有關係,但正如您所說,您來自託管語言背景,請確保不要過多使用垃圾郵件智能指針,並始終首先考慮自動存儲。只是一個小而重要的建議,不得不說。 – 2012-03-28 13:56:02

回答

13

有一個get()成員函數,它爲您提供unique_ptr所擁有的原始指針。儘管如此,這並不會導致unique_ptr放棄所有權,所以適當的清理仍然會發生(謹慎存儲該原始指針!)。

還有一個release()成員函數,放棄所有權。這意味着你又回到了愚蠢的指針地帶,清理是你的責任。

我無法捉摸爲什麼代碼使用擺在首位new,而不是just using automatic storage objects,但我要假裝是有原因的......

+0

謝謝,編譯。在這種情況下get()是慣用的還是正確的選項? – 2012-03-28 13:32:05

+1

如果您傳遞指針的代碼不負責清理(查看子彈網站看起來像是這種情況),是的,get()是正確的選項。 – 2012-03-28 13:34:27

+0

我認爲一般情況下,如果我創建和刪除對象,我擁有它 - 所以我可以使用'get()'? – 2012-03-28 13:37:57

3

get成員函數返回的下屬指針和只要代碼沒有管理你傳入的內存,就可以使用現有的代碼。

相關問題