我對指針並不熟悉,而且我遇到了簡單指針和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(...));
當程序結束時,我的程序崩潰了。
問題:
- 是將一個指向
shared_ptr
這樣的好或壞的主意嗎? - 這是我使用的外部庫的問題嗎?
- 難道我只是不明白指針和共享指針嗎?
有沒有一個簡單的食譜書,你可以按照機械和魔術般地產生正確的C++。您必須*閱讀並理解您使用的API。 API邊界處的對象所有權轉移是文檔的一部分。 – 2014-10-02 22:53:32
「所以我不必如此小心刪除對象」實際上是根本原因,因爲您不會在乎發生了什麼,何時發生或爲何發生。共享指針不允許程序員馬虎,但作爲一種便捷工具,當生命週期和所有權可能在系統之間傳輸時。你仍然需要了解你的對象以及第三方對象的生命週期和所有權。 – JCash 2014-10-02 23:03:44
由於@KerrekSB已經指出:如果API告訴你在使用該對象後負責清理(只要它沒有以任何方式表明它沒有指明),那麼只使用共享(或唯一)指針無條件保留(抱歉三重否定))。另一個問題可能是API告訴你使用* special *刪除函數(就像很多C API一樣);在這種情況下,共享指針可以被賦予刪除功能,但我沒有遇到這種情況,請閱讀shared_ptr文檔以獲取詳細信息。 – leemes 2014-10-02 23:05:31