首頁歷史 > 正文

高質量C++程式碼:智慧指標千萬不要這樣用(一)

2022-03-16由 程式猿老兵 發表于 歷史

我還是先從下面這段程式碼來開始我們今天的分析,大家看看下面這段程式碼存在什麼問題呢?

#include #include #include static int PrintMsg(std::shared_ptr msg) { std::cout << *msg << “\n” << std::endl; return 0;}int main() { auto msg = new std::string(“I‘am Share Msg”); std::shared_ptr share_msg{msg}; std::shared_ptr share_msg2{msg}; std::thread print1(PrintMsg, share_msg); std::thread print2(PrintMsg, share_msg2); print1。join(); print2。join();}

高質量C++程式碼:智慧指標千萬不要這樣用(一)

編譯並執行上面這段程式碼,我們發現執行的時候,出現了錯誤。

為什麼會存在這個錯誤呢?

簡單地說是因為:同一指標交給兩個智慧指標管理導致二次釋放

由於同一塊記憶體由多個管理者託管,但它們彼此之間又不知道對方的存在,這樣就導致在它們各自生命週期結束時都會釋放這塊記憶體的錯誤。

我們應該如何避免類似的錯誤:

不使用相同的raw指標初始化(或reset)多個智慧指標。

不要delete std::shared_ptr::get返回的指標。

不使用std::shared_ptr::get初始化或reset另一個智慧指標。

如果你使用std::shared_ptr::get返回的指標,記住當最後一個對應的智慧指標銷燬後,你的指標就變為無效了。

如果你使用智慧指標管理的資源不是new分配的記憶體,記住傳遞給它一個刪除器。

關注我,教你寫好高質量的程式碼

相關閱讀

C++11 shared_ptr千萬不要迴圈引用

頂部