为什么要有智能指针
全局对象在程序启动时分配,在程序结束时销毁
局部对象在进入其定义所在的程序块时被创建,在离开该程序块时被销毁
局部static对象在第一次使用前分配,在程序结束时销毁
除上述对象外,C++还支持动态分配对象,动态分配的对象的生存期与它们在哪里创建是无关的,只有当显式地被释放时,这些对象才会被销毁。
为了更安全地使用动态对象,C++11提供两种智能指针类型(shared_ptr和unique_ptr,还有一种是weak_ptr,后续再记录)来管理动态对象,其类似常规指针,最大区别是它负责自动释放所指向的对象,其中shared_ptr允许多个指针指向同一个对象,而unique_ptr则独占所指向的对象。
shared_ptr的创建和支持的操作
四种创建方式
//方式1
std::shared_ptr<int> p1(new int(1));
//方式2
std::shared_ptr<int> p2 = p1;
//方式3
std::shared_ptr<int> p3;
p3.reset(new int(1));
//方式4
std::shared_ptr<int> p4 = std::make_shared<int>(2);
shared_ptr和unique_ptr都支持的操作
代码 | 解释 |
---|---|
shared_ptr< T> sp | 空指针,可以指向类型为T的对象(unique_ptr使用格式想相同) |
p | 将p用作一个条件判断,若p指向一个对象,则为true |
*p | 解引用p,获得它指向的对象 |
p->mem | 等价于(*p).mem |
p.get() | 返回p中保存的指针,小心使用 |
swap(p,q) p.swap(q) | 交换p和q中的指针 |
shared_ptr独有的操作
代码 | 解释 |
---|---|
make_shared< T>(args) | 返回一个shared_ptr,指向一个动态分配的类型为T的对象,使用args初始化该对象 |
shared_ptr< T>p (q) | p是shared_ptr q的拷贝,此操作会递增q中的计数器,q中的指针必须能转换为T* |
p=q | p和q都是shared_ptr,所保存的指针必须能相互转化。此操作会递减p的引用计数,递增q的引用计数,若p的引用计数变为0,则将其管理的原内存释放 |
p.unique() | 若p.use_count()为1则返回true;否则返回false |
p.use_count() | 返回与p共享对象的智能指针数量;可能很慢,主要用于调试 |