一、智能指针
- C++的指针包括两种:原始指针(raw pointer)、智能指针
- 智能指针是原始指针的封装,其优点是会自动分配内存,不用担心潜在的内存泄露
- 智能指针只解决了一部分问题,即独占、共享所有权指针的释放、传输
1、独占指针:unique_ptr
特性:
在任何给定的时刻,只能有一个指针管理内存
当指针超出作用域时,内存将自动释放
该类型指针不能Copy,只能Move
独享指针创建:
#include <memory>
unique_ptr<int> UP = make_unique<int>(100);
优点:
- 性能开销小
- 适用于任何场景
缺点: - 不能复杂
- 独占资源
2、共享指针:shared_ptr
应用场景:
- 多个指针指向同一个资源
- 需要自动管理内存资源
特征:
多个共享指针可以同时指向同一个物体
当没有共享指针指向这个物体(对象)时,系统将会自动释放内存资源
创建方法:
//方式一
#include <memory>
shared_ptr<int> p;
p = make_shared<int>(100);
//方式二
shared_ptr<int> p {new int(100)};
//复杂shared_ptr,让多个共享指针指向同一个物体
shared_ptr p2 = p;
cout << *p << endl;
*p2 = 321;
cout << *p2 << endl;
- p.use_count() 记录指向物体的共享指针个数
- p.reset() 清除共享指针,清除后共享指针将不再指向这个物体
shared_ptr<Ball> p = make_shared<Ball>();
cout << p.use_count() << endl;
//use_count 记录有多少个共享指针指向这个物体
p.reset();
这里用到了引用计数的方法,也就是记录指向物体的共享指针个数,个数为0时自动释放内存
共享指针的优点:
- 不需要手动释放内存资源
缺点: - 会产生额外的内存和性能开销:因为shared_ptr会使用引用计数