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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值