2010-08-15 60 views
4

我有遍歷使用原始指針的代碼。原始指針和shared_ptr之間的C++接口

它需要調用一個方法,將原始指針轉換爲shared_ptr。 這個方法不在我的控制之下,屬於外部api。 我不能只傳遞指向shared_ptr的指針,因爲當shared_ptr超出了方法的作用域(當方法返回時)時它將被刪除 。

除了在我的內部代碼中將原始指針設置爲shared_ptr之外,還有其他選項嗎?

+0

爲什麼您的代碼在整個過程中都使用原始指針? – GManNickG 2010-08-15 05:40:31

+0

它不是我的代碼。它是我現在擁有/維護的公司代碼。整個移動指向shared_ptrs的指針是否值得?意見? – user231536 2010-08-15 21:56:17

+0

@user:取決於你的情況。如果您可以使代碼更安全,更快速,更清潔,並且有時間,那麼您應該修復所有代碼。但是有時候你只需要用你擁有的東西來運行,並從那裏改進它。換句話說,關注你需要完成什麼,以及何時有時間修復和升級舊的破壞代碼。 (當然,除非你不能繼續*因爲*代碼被原始指針破壞,那麼顯然修復它。) – GManNickG 2010-08-16 05:34:43

回答

10

這聽起來有點不尋常,可能是相當危險的,但你可以通過構建shared_ptr在使用無操作缺失者做到這一點:

struct no_op_delete 
{ 
    void operator()(void*) { } 
}; 

int* p = 0; // your pointer 
std::shared_ptr<int> sp(p, no_op_delete()); 

sp並用它製成的所有副本已被銷燬,no_op_delete將被調用來清理保存的指針。既然它什麼都不做,你會得到你需要的行爲。

+0

詹姆斯麥克奈利斯從不睡覺xD。 – 2010-08-15 03:38:19

+0

@Prasoon:睡眠只是浪費時間,否則我可以花費編程。 – 2010-08-15 03:40:20

+0

呵呵,那麼你應該閱讀http://serendip.brynmawr.edu/exchange/node/1690 :-) – 2010-08-15 03:51:25

1

詹姆斯已經回答了這個問題。所以,這只是一個建議。如果您知道函數調用不會修改對象(如設置某些數據成員等),則可以從原始指針創建一個新對象,並通過shared_ptr將其傳遞給該函數。這樣,你就可以假設該函數擁有對象的所有權,並執行所需的任何操作。當然,如果函數將修改它中的對象,這是行不通的。如果函數使用該對象作爲只讀來執行其他操作(如用於例如文件I/O),則這可以工作。

相關問題