所需要的头文件
#include <memory>
- shared_ptr : 允许多个指针指向同一个对象;
- unique_ptr : 独占 所指向的对象
- weak_ptr : 弱引用
shared_ptr独有的操作
- make_shared函数 : 最安全的分配和使用动态内存的方法
shared_ptr<int> p3 = make_shared<int>(42);
cout<<*(p3.get())<<endl; //42
shared_ptr<string> p4 = make_shared<string>(10,‘9‘);
cout<<*(p4.get())<<endl; // 10个9
auto p5 = make_shared<int>(); // p5 指向一个初始化的int,初始值为0
auto p6 = make_shared<vector<string>>(); //p6 指向一个动态分配的空vector<string>
// 拷贝和赋值
auto p = make_shared<int>(42);
auto q(p);
cout<<*(q.get())<<endl; // 42
auto r = make_shared<int>(43);
r = q; // r所指向的对象的引用计数器递减,没有了引用者,会自动释放
cout<<*(r.get())<<endl; // 42
shared_ptr和new结合使用
shared_ptr<double> p1;
/*
*shared_ptr<T> p(q)
* p管理内置指针q所指向的对象
* q必须指向new分配的内存,且能够转换为T*类型
*/
shared_ptr<int> p2(new int(42));
// p2 = new int(42); 错误 不能将一个指针赋值给shared_ptr
/*
*p2.reset() 若p2是唯一指向其对象的shared_ptr,reset会释放此对象
* reset 成员经常与 unique 一起使用,来控制多个shared_ptr 共享的对象,
* 在改变底层对象之前,我们检查自己是否是当前对象仅有的用户,如果不是,
* 在改变之前要制作一份新的拷贝
*/
p2.reset(new int(1024)); // p2指向一个新的对象
cout<<*(p2.get())<<endl;
if(!p2.unique())
{
p2.reset(new int(*p2)); // 我们不是唯一用户;分配新的拷贝;
}
*p2 += 22; // 现在我们知道自己是唯一的用户,可以改变对象的值
cout<<*p2<<endl; // 1046