智能指针
基本原理
以栈内存的特性,退出变量生命空间时,栈内存会自动释放,用栈内存来管理堆内存。细节:以一个类的形式管理创建指针,在析构函数delete指针。
还需要重载*和->
可以参考另一篇文章深入重载实践中的重载 * 和 -> 部分
智能指针的作用
C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存。使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。
1、从较浅的层面看,智能指针是利用了一种叫做RAII(资源获取即初始化)的技术对普通的指针进行封装,这使得智能指针实质是一个对象,行为表现的却像一个指针。
2、智能指针的作用是防止忘记调用delete释放内存和程序异常的进入catch块忘记释放内存。另外指针的释放时机也是非常有考究的,多次释放同一个指针会造成程序崩溃,这些都可以通过智能指针来解决。
share_ptr
共享型指针,通过引用计数,如果赋值或拷贝给其他智能指针,则use_count+1;若赋为其他值则use_count-1
unique_ptr
唯一型指针,禁用赋值运算符拷贝构造,唯一拥有其所指对象,任一时刻都只有一个unique_ptr指向其对象。通过move
转移所有权和release
释放所有权。
weak_ptr
weak_ptr
是一种智能指针,它对被 shared_ptr
管理的对象存在非拥有性(“弱”)引用。在访问所引用的对象前必须先转换为 shared_ptr
。
weak_ptr
用来表达临时所有权的概念:当某个对象只有存在时才需要被访问,而且随时可能被他人删除时,可以使用 weak_ptr
来跟踪该对象。需要获得临时所有权时,则将其转换为 shared_ptr
,此时如果原来的 shared_ptr
被销毁,则该对象的生命期将被延长至这个临时的 shared_ptr
同样被销毁为止。
weak_ptr
的另一用法是打断 shared_ptr
所管理的对象组成的环状引用。若这种环被孤立(例如无指向环中的外部共享指针),则 shared_ptr
引用计数无法抵达零,而内存被泄露。能令环中的指针之一为弱指针以避免此情况。
参考博客:
写的巨好的博文:
C++11智能指针的使用