智能指针:责对象生命周期的管理;所以生命期对象全都由unique_ptr和shared_ptr来管理。
原始指针:不负责对象生命周期管理;所以涉及对象的使用而不涉及对象生命周期的管理时,均通过原始指针来使用。
智能指针和原始指针进行转换和传参时可能存在被意外释放的问题,使用时需要注意。比如,
-
对智能指针A获取原始指针a,传入某函数,函数内重新用a包装出智能指针B,那么函数退出B被销毁时,a所指资源已被释放,原智能指针A无法正常使用。(如果资源在栈上将导致程序崩溃)
-
原始指针a指向某资源,它被包装成智能指针A后传给某函数,函数结束时A被销毁,所指向的资源也被释放,此时a也无法再使用。
所以,
对于一个接受原始指针的函数(或代码块),切记不可再将传入的原始指针包装为智能指针。
对于一个接受智能指针的函数(或代码块),切记不要直接将原始指针就地包装传入,而应该一开始就使用智能指针而非原始指针管理对象。