ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++智能指针之weak_ptr

2022-01-03 15:32:47  阅读:187  来源: 互联网

标签:std 指向 weak C++ WeakPtr shared ptr


weak_ptr是一种不控制所指向对象生存周期的智能指针,它指向由一个shared_ptr管理的对象。将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。一旦最后一个指向对象的shared_ptr被销毁,对象会被释放。即使有weak_ptr指向对象,对象也会被释放,因此,weak_ptr的名字抓住了这种智能指针“弱”共享对象的特点。

                                                      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()

如果expired为true,返回一个空shared_ptr;否则返回一个指向w的对象的shared_ptr

 当我们创建一个weak_ptr时,要用一个shared_ptr来初始化它:

auto p = make_shared<int>(42);
weak_ptr<int> wp(p);  //wp弱引用p,p的引用计数未改变,wp指向的对象可能被释放掉

由于对象可能不存在,我们不能使用weak_ptr直接访问对象,而必须调用lock.此函数检查weak_ptr指向的对象是否存在,如果存在,lock返回一个指向共享对象的shared_ptr。

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

核查指针类

//WeakPtr.h
#include "SharedPtr.h"
class WeakPtr
{
public:
	WeakPtr() :curr(0) {}
	WeakPtr(SharedPtr &a, std::size_t size = 0):
		wptr(a.data), curr(size){}
	std::string &deref() const;
	WeakPtr& incr();  //前缀递增
private:
	//若检查成功,check返回一个指向vector的shared_ptr
	std::shared_ptr<std::vector<std::string>> check(std::size_t i, const std::string &msg) const;
	//保存一个weak_ptr,意味着底层vector可能会被销毁
	std::weak_ptr<std::vector<std::string>> wptr;
	std::size_t curr; //在数组中的当前位置
};

//WeakPtr.cpp
#include "WeakPtr.h"

std::string & WeakPtr::deref() const
{
	auto p = check(curr, "deference past end");
	return (*p)[curr];  //(*p)是对象所指向的vector
}

WeakPtr& WeakPtr::incr()
{
	//如果curr已经指向容器的尾后位置,就不能递增它
	check(curr, "deference past end");
	++curr;
	return *this;  //(*p)是对象所指向的vector
}

std::shared_ptr<std::vector<std::string>> WeakPtr::check(std::size_t i, const std::string &msg) const
{
	auto ret = wptr.lock();
	if (!ret)
		throw std::runtime_error("unbound WeakPtr");
	if (i > ret->size())
		throw std::out_of_range(msg);

	return ret;  //否则 返回指向vector的shared_ptr
}

标签:std,指向,weak,C++,WeakPtr,shared,ptr
来源: https://blog.csdn.net/u012069234/article/details/122286452

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有