智能指針:責對象生命周期的管理;所以生命期對象全都由unique_ptr和shared_ptr來管理。
原始指針:不負責對象生命周期管理;所以涉及對象的使用而不涉及對象生命周期的管理時,均通過原始指針來使用。
智能指針和原始指針進行轉換和傳參時可能存在被意外釋放的問題,使用時需要注意。比如,
-
對智能指針A獲取原始指針a,傳入某函數,函數內重新用a包裝出智能指針B,那么函數退出B被銷毀時,a所指資源已被釋放,原智能指針A無法正常使用。(如果資源在棧上將導致程序崩潰)
-
原始指針a指向某資源,它被包裝成智能指針A后傳給某函數,函數結束時A被銷毀,所指向的資源也被釋放,此時a也無法再使用。
所以,
對於一個接受原始指針的函數(或代碼塊),切記不可再將傳入的原始指針包裝為智能指針。
對於一個接受智能指針的函數(或代碼塊),切記不要直接將原始指針就地包裝傳入,而應該一開始就使用智能指針而非原始指針管理對象。