2012-09-14 80 views
16

我與std::shared_ptr和我的軟件開發過程中的工作我遇到了那個讓我懷疑內存管理案例一對夫婦 。我有一個第三方庫, 給了我總是從功能的指針,並在我的代碼我正在將它們 std::shared_ptr(從標準而不是從升壓。順便說一下 兩者之間有什麼區別?)。所以我們可以說我有以下代碼:C++原始指針和std :: shared_ptr的

ClassA* raw = new ClassA; 
std::shared_ptr<ClassA> shared(raw); 

當共享指針超出範圍,現在會發生什麼(假設它是在一個函數 局部聲明,現在我退出功能)。 ClassA對象是否仍然存在,因爲原始指針 指向它?

回答

27

不,它不會。通過給shared_ptr指針,你可以爲shared_ptr負責刪除它。它會在引用它的最後一個shared_ptr對象不再存在時執行此操作。生指針不計數。

+1

只是爲了說明原因:shared_ptr不考慮原始指針,因爲shared_ptr無法知道它。如果你考慮如何自己實現shared_ptr,那麼你會看到你無法檢測到是否有任何指向數據的原始指針。 – Wutz

+1

+1。另外,這就是爲什麼你應該在創建'shared_ptr'的同一行上'new'對象。更好的是,使用['make_shared'](http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared) –

+0

謝謝,實際上我同意沒有辦法找出原始指針是否指向對象。在這種情況下,對於原始指針是很危險的,因爲它會指向一個被銷燬的對象,因爲當超出範圍時shared_ptr會將其銷燬 – ISTB

2

不,ClassA對象將被銷燬。除非你沒有複製shared_ptr某處超出範圍,所以其參考計數器大於1.

5

沒有。共享指針將刪除它。

如果您有爲您提供指針的第三方庫,則需要確保以正確的方式刪除它。例如,如果第三方lib爲它分配了'malloc',那麼您需要使用lib使用的'free'實現。你需要確定它是如何分配的。

圖書館是否提供了銷燬它爲您提供的物品的方法?在這種情況下,您應該使用該功能來銷燬它。