C++——智能指针auto_ptr、unique_ptr、share_ptr、weak_ptr

auto_ptr

相对于普通指针分配内存,需要自己new and delete,若不delete,就会造成内存泄露。auto_ptr智能指针可以做到,指针失效时自动回收内存空间。该指针可以进行复制构造与赋值构造,所以可能造成两个(或多个)指针指向同一内存空间的情况,导致内存空间被释放两次(或多次),造成错误。
C++——智能指针auto_ptr、unique_ptr、share_ptr、weak_ptr_第1张图片

unique_ptr

为了改进auto_ptr的漏洞,unique_ptr智能指针不允许复制构造与赋值构造,也即编程开始便约束了指针无法指向同个空间,避免内存空间被多次释放的错误。但unique_ptr允许移动复制构造与移动赋值构造,即将当前指针的所有权进行转移,之后原先的指针将不再指向该内存,实现一针只指一区域。
C++——智能指针auto_ptr、unique_ptr、share_ptr、weak_ptr_第2张图片

share_ptr

能否实现一针指多区域但不造成内存被多次释放的错误呢?答案是可以的,采用引用计数,一个智能指针指向对象的引用,则加1。当智能指针所指对象引用的计数为0,该内存空间才被释放,否则,不释放。但是嵌套引用造成了一个问题——相互引用,导致内存空间无法到达智能指针引用计数为0的局面,即永远无法释放内存空间。

C++——智能指针auto_ptr、unique_ptr、share_ptr、weak_ptr_第3张图片

C++——智能指针auto_ptr、unique_ptr、share_ptr、weak_ptr_第4张图片

weak_ptr

为了解决相互引用导致的内存空间无法释放,可以使用weak_ptr代替相互引用的其中一个share_ptr,使一个对象智能指针计数可到达0,实现内存空间的释放。weak_ptr的作用即指向资源空间时,不增加智能指针引用计数,并且其不具有资源空间的所有权限。

C++——智能指针auto_ptr、unique_ptr、share_ptr、weak_ptr_第5张图片

你可能感兴趣的:(C++)