介绍一下智能指针
智能指针是C++11引入的一种RAAI机制,用于自动管理动态内存,避免手动管理内存带来的内存泄露和悬挂指针问题。C++标准库主要有三种智能指针:unique_ptr、shared_ptr、weak_ptr。常用的两种
unique_ptr
:独占所有权,一个对象的所有权只能归一个unique_ptr所有
shared_ptr
:共享式所有权,多个指针共同管理一块内存。最后一个shared_ptr销毁时,对象才会被释放。
unique_ptr是如何实现的
unique_ptr通过类模板实现,一个基本的类包括默认构造函数、构造函数、拷贝构造函数、移动构造函数和析构函数。unique_ptr通过拷贝构造函数=delete
实现独占效果,只能通过移动语义
转移所有权。
std::unique_ptr<int> ptr1(new int(5));
// ptr1独占内存,无法复制,但可以转移所有权
std::unique_ptr<int> ptr2 = std::move(ptr1);
此外,unique_ptr还提供了如下常用操作
reset
:删除当前管理的对象并接管新对象
release
:释放所有权并返回原始指针,需要手动删除
get
:get方法返回原始指针,但不改变所有权
shared_ptr是如何实现的
shared_ptr类中维护一个atomic
的引用计数
,因此是线程安全
的。
当需要管理新的对象时,传入参数为对象本身,调用
构造函数
:会开辟一个控制块用于存储引用计数,供所有对象共享。
当指向已有对象时,传入参数为shared_ptr,调用
拷贝构造函数
:当前对象的控制块和指针分别指向传入对象的控制块和指针,并将引用计数加一。
析构函数
:当一个shared_ptr退出作用域或者主动释放时,计数减一。如果计数变为0则删除管理的对象和控制块。
std::shared_ptr<int> ptr1(new int(5));
std::shared_ptr<int> ptr2 = ptr1;
// ptr1和ptr2指向同一块内存,引用计数为2
shared_ptr提供了get
、reset
、release
和
use_count
:返回当前的引用计数
什么是weak_ptr
循环引用
:当两个对象互相持有shared_ptr时,它们的引用计数都是2,因此两个对象的内存无法被释放。
weak_ptr不会增加引用计数,因此将其中的一个shared_ptr替换为weak_ptr即可打破这个循环。
std::shared_ptr<int> ptr1(new int(5));
std::weak_ptr<int> ptr2(ptr1);
// ptr1和ptr2指向同一块内存,但引用计数仍然为1
- 常用操作
lock
:获得绑定的shared_ptr,如果对象已经销毁,则返回一个空的shared_ptr
expired
:检查绑定的shared_ptr是否被销毁