C++基础:std::enable_shared_from_this的作用

 使用share_ptr管理自定义类型存在的问题

​#include <memory>
#include <iostream>

class B
{
public:
    void func() {
        // 1.使用this裸指针进行共享指针的初始化
        std::shared_ptr<B> local_sp_b(this);
        // 2.local_sp_b限定在作用域内,计数为1
        std::cout << local_sp_b.use_count() << std::endl;
        // 3.退出作用域后local_sp_b计数减1->变成0->自动回收指向的内存
    }
};

int main()
{
    std::shared_ptr<B> spb(new B());
    spb->func();
    // 4.这里开始spb指向的内存已经被释放,虽然spb的计数为1
    std::cout << spb.use_count() << std::endl;
    spb->func();  // 5.内存崩溃
    return 0;
}

  可以看到 虽然local_sp_b和spb都是指向同一内存,但是他们的引用计数是分别独立的, 这种情况会造成内存崩溃

  使用c++11引入的std::enable_shared_from_this ( boost库的也行) 解决此问题

#include <memory>
#include <iostream>
class A : public std::enable_shared_from_this<A> 
{
public:
    void func() {
        std::shared_ptr<A> local_sp_a = shared_from_this();
        // 1.引用计数为2,说明local_sp_a和spa共享引用计数
        std::cout << local_sp_a.use_count() << std::endl;
        // 2.退出作用域时引用计数为1, 不会释放指向的内存
    }
};

int main()
{
    std::shared_ptr<A> spa(new A());
    spa->func();
    // 3.引用计数为1,说明local_sp_a和spa共享引用计数
    std::cout << spa.use_count() << std::endl;
    return 0;
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值