为什么要有
很容易因为忘记释放内存而造成内存泄漏;以及在仍有(其他)指针引用(同一块)内存的情况下,使用当前指针进行内存的释放,这会使得其他指针指向非法内存
为了更安全地使用动态内存,新的标准库提供了两种**智能指针(smart pointer)**来管理动态对象
shared_ptr
类
#include <memory>
// 默认初始化,其保存了一个空指针
shared_ptr<string> p1;
// 用args初始化一个动态分配的类型为T的对象,返回指向该对象的shared_ptr
shared_ptr<T> p2 = make_shared<T>(args);
// 返回保存的指针
string *p3 = p.get();
// 交换保存的指针
swap(p1, p2);
// 支持一些和普通指针相同的操作
// 若p指向一个对象则返回true
p
// 解引用
*p
// 等价于(*p).memberPointer
p->memberPointer
make_shared
标准库函数,最安全的用法
拷贝和赋值
每个shared_ptr
都有一个关联的计数器,称为引用计数(reference count),对shared_ptr
进行拷贝或赋值时,所有指向该对象的shared_ptr
的引用计数都会增加
计数增加
- 拷贝:用一个
shared_ptr
初始化另一个shared_ptr
- 作为函数的参数传递
- 作为函数的返回值
计数减少
- 给
shared_ptr
赋新值(指向新的对象,自然要减少之前对象的计数) shared_ptr
被销毁(比如局部的shared_ptr
离开了其作用域)