std::enable_shared_from_this到底有啥用?

网上很多文章磨磨唧唧也说不清楚,给出的示例没有啥参考价值,

今天我说一下我的理解。

我有一个需求,在类内部保留一个引用,即把自己的智能指针传递给其他的类:

1)在类的内部是不能二次使用shared_ptr来引用自己的,这样会循环引用无法释放;

2)这样就是内部需要一个weak_ptr来引用自己,但是这个值如何初始化是个问题:

因为不能使用类似下面的语句直接初始化,

weak_ptr<A> weak = this;

但是,如果类从std::enable_shared_from_this继承了,就可以了:

weak_ptr<A> conn = this->shared_from_this();

之后,再次引用时候可以通过weak_ptr锁定,可以二次获得shared_ptr;

代码如下:

// testShare.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <memory>

using namespace std;

class A : public enable_shared_from_this<A>
{
public:
	A()
	{

	}
	void set()
	{
		conn = this->shared_from_this();
	}
	int a;
	weak_ptr<A> conn;
};
int main()
{
	std::shared_ptr<A> ptr = std::make_shared<A>();
	cout << ptr.use_count() << endl;  // 1
	std::shared_ptr<A> ptr1 = ptr->conn.lock();

	if (!ptr1)
	{
		std::cout << "null\n";        // null
	}

	ptr->set();
	cout << ptr.use_count() << endl;  // 1

	ptr1 = ptr->conn.lock();

	cout << ptr.use_count() << endl;  // 2
}


3)但是如果该类实例被删除了,weak_ptr也没有;其实此类将自己的智能指针传递给其他类时,实例本身自己还是活着的,所以函数直接this->shared_from_this()就可以;

比如:

fun(std::shared_ptr<A>& ptr)
{
    dosomething();
}

// 在A的内部可以如下调用此函数

std::shared_ptr<A>& ptr =  this->shared_from_this();
fun(ptr);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值