记录C++智能指针相关操作.
std::shared_ptr
共享式智能指针, 允许多个指针指向同一个对象, 使用引用计数保证资源的正确释放.
//初始化指针
std::shared_ptr<int>ps1(new int(10));
std::shared_ptr<int>ps2 = std::make_shared<int>(20);
//成员函数
auto isc = ps1.use_count(); //指向同一个对象的shared_ptr数目(引用计数)
bool isUnique = ps1.unique(); //是否只有当前shared_ptr指向对象
ps1.reset(); // 当前shared_ptr所指对象的相关shared_ptr引用计数减1或者被释放. 带参数(裸指针)时, 指向新对象; 不带参数时, 置空
int *pr = ps1.get(); //获取当前智能指针包装的裸指针
ps1.swap(ps2); //交换两个指针所指的对象, std::swap(ps1, ps2)也可以
//处理数组对象, 特别是类数组对象
class A{
public:
A(){std::cout<<"测试构造函数"<<std::endl;};
~A(){std::cout<<"测试析构函数"<<std::endl;}
};
std::shared_ptr<A>pa1(new A[3], [](A*a){delete []a; a=nullptr;}); //使用自定义删除器
std::shared_ptr<A>pa2(new A[3], std::default_delete<A[]>()); //使用标准库类模板
std::weak_ptr
辅助std::shared_ptr使用, 指向一个由std::shared_ptr管理的对象.
//初始化指针
std::shared_ptr<int>ps(new int(3));
std::weak_ptr<int>pw(ps); //不会增加shared_ptr的引用计数
//成员函数
auto isc = pw.use_count(); //所指对象的引用计数
bool isExist = pw.expired(); //所指对象是否存在
pw.reset(); //将当前weak_ptr对象置空, 不会影响相关shared_ptr对象的状态
std::shared_ptr<int>ps1 = pw.lock(); //获取所指对象的shared_ptr对象,导致相关引用计数增加
std::unique_ptr
独占式智能指针,独自拥有对资源的管理权限. 为了实现独占, 防止不经意的错误, 内部禁用了拷贝构造函数和赋值运算符函数.
//初始化指针
std::unique_ptr<int>pu1(new int(10));
std::unique_ptr<int>pu2 = std::make_unique<int>(20); //c++14提供的函数
//成员函数
int *pu = pu1.get();
int *pur = pu1.release(); //断开unique_ptr对象对资源的管理权并将其置空, 资源需要手动释放
pu2.reset(); //释放原先所指对象, 带参数则指向新对象, 不带参数则置空当前unique_ptr
pu1.swap(pu2); //或者std::swap(pu1, pu2);
//处理数组对象, 特别是类数组对象
std::unique_ptr<A[]>pa1(new A[3]);
auto myDeleter = [](A *a){delete []a; a=nullptr;}; //自定义的删除函数
std::unique_ptr<A, decltype(myDeleter)>pa2(new A[3], myDeleter); //需要在模板参数中指明删除函数的类型
std::unique_ptr转换到std::shared_ptr
std::unique_ptr<int>pu = std::make_unique<int>(3);
std::shared_ptr<int>ps = std::move(pu); //pu拥有的对象被ps接管, pu置空