【C++八股】智能指针

介绍一下智能指针

智能指针是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提供了getresetrelease
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是否被销毁
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值