C++ 11 std::enable_shared_from_this

C++11 std::enable_shared_from_this

一 介绍

1 申明

std::enable_shared_from_this
template< class T > class enable_shared_from_this;(C++11)

std::enable_shared_from_this 能让其一个对象(假设其名为 t ,且已被一个 std::shared_ptr 对象 pt 管理)安全地生成其他额外的 std::shared_ptr 实例(假设名为 pt1, pt2, … ) ,它们与 pt 共享对象 t 的所有权。一个使用场景是异常调用中的保活。

2 成员函数

`shared_from_this: 返回共享 *this 所有权的 shared_ptr

'weak_from_this (C++17): 返回共享 *this 所有权的 weak_ptr`

二 举例

#include <iostream>
#include <memory>
 
class A {
 public:
  A() {
    std::cout << "A()" << std::endl;
  }
  ~A() {
    std::cout << "~A()" << std::endl;
  }
 
  std::shared_ptr<A> ptr_dangerous() {
    return std::shared_ptr<A>(this);
  }
};
 
class B : public std::enable_shared_from_this<B> {
 public:
  B() {
    std::cout << "B()" << std::endl;
  }
  ~B() {
    std::cout << "~B()" << std::endl;
  }
 
  std::shared_ptr<B> ptr() {
    return shared_from_this();
  }
};
int main() {
  {
    std::cout << 1 << std::endl;
    auto p = std::make_shared<B>();
    auto p1 = p->ptr();
    std::cout << "use_count(): " << p.use_count() << std::endl;
  }
 
  {
    // error
    std::cout << 2 << std::endl;
    auto p = std::make_shared<A>();
    auto p1 = p->ptr_dangerous();
    std::cout << "use_count(): " << p.use_count() << std::endl;
  }
 
  system("pause");
  return 0;
}

结果:
在这里插入图片描述
A析构两次,导致程序崩溃。

三 参考

stackoverflow: std::enable_shared_from_this

cpprefrence: std::enable_shared_from_this

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值