对于enable_shared_from_this、shared_from_this使用笔记

文章为转载+汇总
参考:C++11标准库的一个工具类enable_shared_from_this的作用及原理分析
从这篇文章中可以知道:
当一个类public继承enable_shared_from_this时,会获得一个共有方法shared_from_this:

class T : public enable_shared_from_this<T> {
};
shared_ptr<T>  shared_from_this();

这个东西的引入是为了解决下面的这个问题:
某个类的对象内存的生命周期由智能指针来管理,此时要在一个类的成员函数中,对外部返回shared_ptr构造的this指针会有问题。注意这里返回原生的this指针是可以的。
核心的问题,就是:

    1. 如果采用返回拷贝,那么临时变量会把this析构掉
    1. 如果采用返回引用,那么obj对象本身必须持有一个管理他的shared_ptr,这样会导致obj永远不会被释放
      可用的解决方案有以下两种

    void getSharedFromParam(shared_ptr<obj>& p) {
        p.reset(this);    // 通过函数参数来实现规避掉拷贝语义,但是这样太过于丑陋
    }

    shared_ptr<obj> getSharedFromThis() {
        return shared_from_this();  // 这是C++11推荐的方法,可以实现安全的返回一个shared_ptr<this>,返回到外面的shared_ptr的拷贝的use_count是1,不用担心this被意外delete和引用计数异常的问题。
    }

注意:当你想使用getSharedFromThis时,必须以智能指针构造,而非以raw指针形式。否则会报std::bad_weak_ptr的错

int main() {
    auto p =std::make_shared<obj>();
    // auto p = new obj();
    p->getSharedFromThis()->doSomething();
}

enable_shared_from_this类中使用了一个私有weak_ptr来保存地址,在shared_from_this()通过把这个weak_ptr转换为引用计数为1的shared_ptr返回,避免了临时shared_ptr析构导致this被delete。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值