我现在有一段代码:
int main(int argc, char const *argv[]) { int *p = new int(5); return 0; }
使用了上篇博客刚学的new,new了一个int对象 值为5,但是在结束之前没有delete,也可以通过编译,也没报错。
如果我代码量很大那很容易因为这个指针没有及时释放而对程序整体进行破坏,或者叫 内存泄露。
我们都知道必须在new过之后使用delete,但是delete后的指针并非指空,除非你手动让其为NULL
如果遇到这样的情况
auto func(int &a) { int *p = new int(1); if(a == 7) { /*执行一个什么程序*/ return 5; } delete p; p = NULL; return 3; }
满足了一个条件之后直接跳去执行其他的函数了回来就已经return了,那这个指针就没得delete了
可能会有很多我们new过了忘记delete的情况
所以为了解决这样的问题:我们引入了智能指针
1)智能指针能够帮助我们处理资源泄露问题;
2)它也能够帮我们处理空悬指针的问题;
3)它还能够帮我们处理比较隐晦的由异常造成的资源泄露。
智能指针
1、auto_ptr c++11 已经将此指针弃用,所以可以少学一个指针了
2、shared_ptr 多个指针可以指向相同对象,在最后一个引用被销毁时释放
3、unique_ptr 同一时间内只有一个指针可以指向该对象
4、weak_ptr 弱智能指针,配合shared_ptr使用
shared_ptr
首先包含头文件
#include <memory>
使用方法如下:
shared_ptr<int> ptr1(new int(4));
表示定义了一个指向 int 型数据 4 的 int 型指针 ptr
shared_ptr<int> ptr2(ptr1)
表示用 ptr1 去初始化 ptr2
shared_ptr<int> ptr3
相当于以前的 int *ptr = new int ; 或者 只是 int *ptr
然后使用这个ptr3
ptr3.reset(new int(6));
把ptr3的值传给p
int *p = ptr3.get();
引用计数,查看被引用了多少次
ptr.use_count()
检查ptr是否原始指针唯一拥有者
ptr.unique()
交换p q两个指针
swap(q,p);
p.sawp(q);