1樓:
你這個例子的確ok,但我還不清楚為什麼,有木有大佬能解釋下?
我知道的是,如果要動態分配物件,並用基類指標持有物件,那麼基類的析構函式必須是虛的,否則釋放時候可能未定義。
我覺得你不能依賴這個例子來決定以後就不把基類的析構宣告為虛的。
更新下。。
這樣寫能正確呼叫析構函式:
std::shared_ptr p = std::make_shared();
這樣寫也能正確呼叫的:
std::make_unique();
但是,這樣寫就不行啦:
std::unique_ptr p = std::make_unique();
.....所以。。如果打算用shared_ptr,那麼不寫虛析構函式也是木有問題的啦。。。
2樓:
你的Base的destructor不是virtual,用base的destructor來destruct任何它的derived classes是未定義行為。unique_ptr的行為是合理的。shared_ptr的行為則別人說了。
還有make_unique/shared的意義就是用auto然後當作新的new來用,等號左側不需要顯式宣告。
3樓:Potato TooLarge
可參看這個問題及其回答:
c++11中std::unique_ptr需要明確知道型別的析構函式,而shared_ptr不需要?
C 的智慧型指標不就基本解決了野指標問題了嗎 為什麼還要吹捧rust的記憶體安全
News Rust的記憶體安全解決方案是系統 戰略性的,從總體把握了整個記憶體安全方面的問題。c 的智慧型指標解決了野指標問題,它只是乙個方法,沒有整體的解決了記憶體安全方面的所有問題 Rust 的記憶體安全,給出的是一套完整的解決方案。 gunir 我不明白為啥要捧一踩一。天下沒有免費的午餐,你不...
用 C 語言或者限制使用智慧型指標的 C 開發的系統,不用智慧型指標怎麼做記憶體管理?
權少 C語言就自己寫個MALLOC和FREE,每次申請都記住位置,配合記憶體池。C 98就用boost的或者自己寫個,一千幾百行的事。 weisonx 最近在看Linux核心原始碼,就寫寫Linux核心如何做記憶體管理的 大概 首先資源的分配基本是在專門的初始化函式中進行 若分配中途失敗了,還要及時...
c11有什麼新特性?
丁冬 隨便挑幾個說說吧 1.永不返回 Noreturn Noreturn void suicide 2.編譯期斷言 Static assert Static assert STDC VERSION 201112L C11 support required Guess Idon t really ne...