九、 通用工具 ----smart Pointer(智能指针)---weak_ptr

2 class weak_ptr

shared_ptr的限制:
1. 环式指向: 两个shared_ptr的对象互相指向对方,如果想要释放它们,shared_ptr不会释放数据,因为它们的unse_count()为1;
2. “明确想共享,但是不愿拥有”:标准库定义了class weak_ptr,允许“共享但是不拥有”某对象;一旦拥有该对象的最后一个shared_ptr失去拥有权之后,weak_ptr自动成空;


2.1 构造函数

因此,class weak_ptr只接受一个shared_ptr的构造函数:

//default (1)   
constexpr weak_ptr() noexcept;
//copy (2)  
weak_ptr (const weak_ptr& x) noexcept;
template <class U> weak_ptr (const weak_ptr<U>& x) noexcept;

//from shared_ptr (3)   
template <class U> weak_ptr (const shared_ptr<U>& x) noexcept;

说明:
1. weak_ptr不能使用操作符*->访问weak_ptr指向的对象;必须例外建立一个shared_ptr
原因:
(1).weak_ptr指向的对象可能不存在,使用它的函数lock()可以返回一个指向共享对象的shared_ptr,不存在,返回一个空的shared_ptr;
(2).当所指的对象正被处理的时候,shared pointer无法被释放

2.2 weak_ptr的部分操作

表达式效果
weak_ptr<T> w空weak_ptr,可指向T类型的对象
weak_ptr<T>w(sp)与shared_ptr sp 指向相同对象的weak_ptr。T必须能够转化为sp指向的类型;
w = pp 可以是一个shared_ptr或者一个weak_ptr,赋值后w与p共享对象
w.reset()将 w置为空
w.use_count()与w共享对象的shared_ptr的数量
w.expired()若w.use_count() 为0,返回true,否则返回false
w.lock()如果w.expired()为true,返回一个空的shared_ptr,否则返回一个指向w的对象的shared_ptr;

不能直接用weak_ptr访问对象,使用shared_ptr:

if(shared_ptr<int> np = wp.lock())//如果np不为空条件成立
{
   //在if中,np与p共享对象
}

这个时候,使用np访问对象是安全的;

2.3 weak_ptr的所有操作

weak_ptr的所有操作

weak_ptr的高层原子操作

智能指针是C++中用于管理动态分配的内存的一种机制。它们可以自动地在不再需要时释放内存,从而避免内存泄漏和悬挂指针的问题。 shared_ptr是一种引用计数智能指针,它可以跟踪有多少个shared_ptr指向同一个对象,并在没有引用时自动释放内存。当创建shared_ptr时,它会增加引用计数,当销毁或重置shared_ptr时,它会减少引用计数。只有当引用计数为0时,才会真正释放内存。\[1\]shared_ptr可以通过构造函数接受一个指向动态分配对象的指针来创建,也可以使用std::make_shared函数来创建。\[2\] unique_ptr是一种独占智能指针,它拥有对动态分配对象的唯一所有权。当unique_ptr被销毁时,它会自动释放内存。unique_ptr不能被复制,但可以通过std::move函数进行转移所有权。\[3\]unique_ptr可以通过构造函数接受一个指向动态分配对象的指针来创建。 weak_ptr是一种弱引用智能指针,它指向由shared_ptr管理的对象,但不会增加引用计数。weak_ptr可以用于解决shared_ptr的循环引用问题,因为它不会导致对象无法释放。\[1\]weak_ptr可以通过shared_ptr的构造函数来创建。 auto_ptr是C++11之前的一种智能指针,它类似于unique_ptr,但有一些限制和问题。auto_ptr在复制时会转移所有权,这可能导致悬挂指针的问题。因此,auto_ptr已经被unique_ptr取代,不推荐使用。 总结来说,shared_ptr是引用计数智能指针,unique_ptr是独占智能指针weak_ptr是弱引用智能指针,而auto_ptr是已经过时的智能指针。它们各自有不同的用途和特点,可以根据具体的需求选择使用。 #### 引用[.reference_title] - *1* *2* *3* [C++11 解决内存泄露问题的智能指针:shared_ptr、unique_ptrweak_ptr](https://blog.csdn.net/weixin_44120785/article/details/128714630)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值