2014-10-02 36 views
1

我對指針並不熟悉,而且我遇到了簡單指針和std::shared_ptr之間的區別。我想使用shared_ptr,所以當沒有指向它時,我不必非常小心地刪除對象。我可以在任何地方使用shared_ptr我想使用簡單的指針嗎?

我遇到了我正在使用的庫/標題(easylogging++)。我不認爲這是外部庫的問題,而是使用指針。該庫有一個返回指向對象的簡單指針的函數。我總是將簡單的指針轉換爲shared_ptr,這就是發生問題的地方。

// Works fine---but I want a shared_ptr 
Object* MyInstance(ReturnPointerToObject(...)); 
// Compiles fine, but crashes during deallocation of the Object (Seg fault?) 
std::shared_ptr<Object> MyInstance(ReturnPointerToObject(...));  

當程序結束時,我的程序崩潰了。

問題:

  1. 是將一個指向shared_ptr這樣的好或壞的主意嗎?
  2. 這是我使用的外部庫的問題嗎?
  3. 難道我只是不明白指針和共享指針嗎?
+2

有沒有一個簡單的食譜書,你可以按照機械和魔術般地產生正確的C++。您必須*閱讀並理解您使用的API。 API邊界處的對象所有權轉移是文檔的一部分。 – 2014-10-02 22:53:32

+4

「所以我不必如此小心刪除對象」實際上是根本原因,因爲您不會在乎發生了什麼,何時發生或爲何發生。共享指針不允許程序員馬虎,但作爲一種便捷工具,當生命週期和所有權可能在系統之間傳輸時。你仍然需要了解你的對象以及第三方對象的生命週期和所有權。 – JCash 2014-10-02 23:03:44

+1

由於@KerrekSB已經指出:如果API告訴你在使用該對象後負責清理(只要它沒有以任何方式表明它沒有指明),那麼只使用共享(或唯一)指針無條件保留(抱歉三重否定))。另一個問題可能是API告訴你使用* special *刪除函數(就像很多C API一樣);在這種情況下,共享指針可以被賦予刪除功能,但我沒有遇到這種情況,請閱讀shared_ptr文檔以獲取詳細信息。 – leemes 2014-10-02 23:05:31

回答

5

當你構建一個shared_ptr一個對象(從以外的任何現有shared_ptrweak_ptr到對象)要創建一個新的方案來管理對象的生命週期。如果其他東西已經控制了該物體的壽命,那麼這是一個完全破碎的事情。例如,如果ReturnPointerToObject返回指向其他人的對象的指針,則無權控制該對象的使用壽命,因此創建shared_ptr就意味着其行爲被破壞,並且將導致delete被錯誤地調用。

我也只是建議不要使用shared_ptr你實際上不需要共享指針。 C++的方式是,你不支付你不使用的東西,而其他機制(如unique_ptr)存在於不需要共享的情況下。當然,您應該儘可能採取避免裸指針的政策。

+0

鑑於「過早優化是萬惡之源」,默認情況下使用shared_ptr沒有意義嗎?它提供了GC'd語言的便利。當使用unique_ptr時,我必須在某些情況下顯式調用移動來觸發移動語義,並且我不能在列表初始值設定項中使用unique_ptr,因爲它會觸發副本。 – KeyboardDrummer 2015-09-03 14:38:17

+0

@KeyboardDrummer這不是關於優化,而是關於語義的正確性。如果只有一件事情應該擁有一個對象,那麼使用'unique_ptr'允許您在編譯時強制執行此操作,並瞭解何時和何處所有權正在傳輸。 – 2015-09-03 16:27:31

+0

是的,「如果只有一件東西應該擁有一個對象」,unique_ptr是理想的。但是,你爲什麼會這樣想?鑑於我正在使用一些指針,我只需要知道我是否是業主之一。我對我是否是唯一的所有者沒有興趣,對吧? unique_ptr對shared_ptr的主要優勢對我來說似乎仍然是假設它更快。鑑於你的專長@David Schwartz,如果我不正確,請賜教。 – KeyboardDrummer 2015-09-09 08:16:18

相關問題