简介本文对C++中4种智能指针使用进行简单总结:auto_ptr、unique_ptr、shared_ptr和weak_ptr这4种智能指针。感兴趣的朋友可以参考一下。
解决C++内存泄漏最有效的办法就是使用智能指针(Smart Pointer)。使用智能指针就不用担心这个问题了,因为智能指针可以自动删除分配的内存。智能指针和普通指针类似,只是不需要手动释放指针,而是通过智能指针自己管理内存的释放,这样就不用担心内存泄漏的问题了。
C++提供了auto_ptr、unique_ptr、shared_ptr 和 weak_ptr 这几种智能指针(auto_ptr 是 C++98 提供的解决方案,C+11 已将将其摒弃,并提供了另外两种解决方案。)在此这里只介绍后三个智能指针:
(1)shared_ptr 共享的智能指针:
shared_ptr 使用引用计数,每一个 shared_ptr 的拷贝都指向相同的内存。在最后一个 shared_ptr 析构的时候,内存才会被释放。
注意事项:
(2)unique_ptr 独占的智能指针:
Unique_ptr 是一个独占的智能指针,他不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个 unique_ptr 赋值给另外一个 unique_ptr 。
unique_ptr 不允许复制,但可以通过函数返回给其他的 unique_ptr,还可以通过 std::move 来转移到其他的 unique_ptr,这样它本身就不再拥有原来指针的所有权了。
如果希望只有一个智能指针管理资源或管理数组就用 unique_ptr,如果希望多个智能指针管理同一个资源就用 shared_ptr 。
(3)weak_ptr 弱引用的智能指针:
弱引用的智能指针 weak_ptr 是用来监视 shared_ptr 的,不会使引用计数加一,它不管理 shared_ptr 内部的指针,主要是为了监视 shared_ptr 的生命周期,更像是 shared_ptr 的一个助手。 weak_ptr 没有重载运算符*和->,因为它不共享指针,不能操作资源,主要是为了通过 shared_ptr 获得资源的监测权,它的构造不会增加引用计数,它的析构不会减少引用计数,纯粹只是作为一个旁观者来监视 shared_ptr 中关连的资源是否存在。 weak_ptr 还可以用来返回 this 指针和解决循环引用的问题。
本文向大家介绍一个C++实战项目:C++实现雪花算法(SnowFlake)产生唯一ID,主要涉及雪花算法、算法知识等,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文介绍一个C++代码片段:如何在C++中删除一个文件目录下的所有文件及目录,感兴趣的朋友可以参考一下。
本文介绍C++实现C++实现8种排序算法,主要包括冒泡排序、插入排序、二分插入排序、希尔排序、直接选择排序、堆排序、归并排序、快速排序,直接上代码,感兴趣的朋友可以参考一下。
本文介绍C++实现线程同步的四种方式:事件对象、互斥对象、临界区、信号量,感兴趣的朋友可以参考一下。
本文介绍C++内存泄漏的检测与定位方法,感兴趣的朋友可以参考一下。
本文向大家介绍一个C++实战项目:C++实现一个多线程安全的队列容器模板类,主要涉及C++模板类的使用、互斥体实现多线程安全、队列数据结构等知识,具有一定的C++实战价值,感兴趣的朋友可以参考一下。