C++:智能指针 SmartPointer
Contents
本文采用知识共享署名 4.0 国际许可协议进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,可适当缩放并在引用处附上图片所在的文章链接。
简介
智能指针是存储指向动态分类(堆)对象的指针的类,用于生存期控制,确保在离开指针作用域时,自动正确销毁动态分配的对象。
通过引用计数的技术来实现,每使用它一次,内部的引用计数就加1,每析构一次,引用计数减1,减到0时就销毁对象,回收内存。
头文件 #include
分类
三种智能指针:
- std::shared_ptr 实现共享式拥有,多个指针可以指向相同的对象,该对象和相关资源会在最后一个reference被销毁时释放
- std::unique_ptr 实现独占式拥有,保证同一时间内只有一个指针可以指向该对象
- std::weak_ptr 持有被shared_ptr所管理对象的引用,但是不会改变引用计数值。允许共享但不拥有某对象 另一方面,auto_ptr已经被废弃,C98,之前和std::unique_ptr一个意思
shared_ptr
创建智能指针时必须提供额外的信息,指针可以指向的类型:
智能指针检查
shared_ptr和unique_ptr都支持的操作

shared_ptr特有的操作

make_shared函数:最安全的分配和使用动态内存的方法就是调用一个名为make_shared的标准库函数,此函数在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr。头文件和share_ptr相同,在memory中。
shared_ptr的拷贝和赋值
可以认为每个shared_ptr都有一个关联的计数器,通常称其为引用计数,无论何时我们拷贝一个shared_ptr,计数器都会递增。当我们给shared_ptr赋予一个新值或是shared_ptr被销毁(例如一个局部的shared_ptr离开其作用域)时,计数器就会递减,一旦一个shared_ptr的计数器变为0,它就会自动释放自己所管理的对象。
定义和改变shared_ptr的其他方法

unique_ptr
某个时刻只能有一个unique_ptr指向一个给定对象,由于一个unique_ptr拥有它指向的对象,因此unique_ptr不支持普通的拷贝或赋值操作。
unique的操作

