2012-10-25 124 views
4

從工廠返回指針的最佳方式是什麼?它應該是std::unique_ptrstd::shared_ptr還是隻是一個原始指針?從工廠返回指針

另外,有人告訴我,如果有遏制,應該去std::unique_ptr,如果有聚集,應該去std::shared_ptr。這是正確的方法嗎?

回答

5

只有在非常特殊的情況下,您才應該考慮原始指針,例如通過DLL邊界傳遞指針。

shared_ptrunique_ptr之間,我的看法是喜歡後者。這使您的用戶界面更加靈活。如果他們願意,他們總是可以將返回的unique_ptr轉換爲shared_ptr,但更重要的是,他們也可以調用unique_ptr::release,然後手動管理指針(可能不是一個好主意,但它使選項保持打開狀態)。

如果你的工廠需要分配爲返回unique_ptr一個定製刪除,unique_ptrshared_ptr之間行爲上的差別,你應該知道的是,前者將不會調用缺失者如果託管指針nullptr,但後者將。因此,如果您的工廠可能會返回nullptr(也許作爲失敗情況),並且某人將unique_ptr轉換爲shared_ptr,那麼請確保刪除程序可以處理使用nullptr作爲其參數調用。

+0

據我所知,工廠只負責創建對象。如果我使用unique_ptr,是否意味着責任轉移給了工廠的客戶。任何見解?對於DLL邊界,如果我使用shared_ptr,那麼自定義刪除器將能夠調用適當的析構函數,不是嗎? – Atul

+0

@Atul否,'unique_ptr'會在超出範圍時自動刪除管理對象。如果您需要在邊界上維護C ABI,則應該只考慮跨越DLL邊界傳遞裸指針。如果這不是問題,你可以在邊界上傳遞'shared_ptr'。 – Praetorian

+0

如果您確實需要在DLL邊界處使用原始指針,則您必須將DLL導出返回原始指針的工廠函數以及客戶端必須調用的刪除函數以銷燬該對象。然後,在客戶端包含的頭文件中,您將定義一個調用導出的工廠函數的包裝函數,並將其與調用導出的deleter函數的刪除程序一起放入「shared_ptr」或「unique_ptr」中。 – Praetorian

0

你當然不應該返回一個原始指針。我認爲std :: unique_ptr和std :: shared_ptr在大多數情況下都是相同的。但是,當然標準的智能指針類不是唯一的。例如,有一些類實現了入侵式引用計數,並且人們實現了一個特殊的智能指針類來處理它們,通常稱爲RefPtr。還有COM接口,有CComPtr。