东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1118|回复: 1

[C/C++] 智能指针shared_ptr与weak_ptr的完美结合使用

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14427
QQ
发表于 2021-9-15 09:25:44 | 显示全部楼层 |阅读模式




智能指针shared_ptr与weak_ptr的完美结合使用

类:默认是用智能指针管理的  在类的内部当需要将自己作为智能指针的时候可以传入过去 而不需要构造一个假的导致对象被析构
类要继承 : public std::enable_shared_from_this<类名>  {}
使用: this.shared_from_this()  本质是将weak_ptr转为shared_ptr


class GR_RUNTIME_API basic_block : public msg_accepter,
                                   public boost::enable_shared_from_this<basic_block>




  1. #include <iostream>
  2. #include <memory>


  3. class Object{
  4.     public:
  5.         Object(int id) : m_id(id) {}
  6.         int m_id;
  7.         ~Object(){
  8.             printf("对象id=%d析构了!\n", m_id);
  9.         }
  10. };

  11. void shared_ptr_with_weak_ptr(){
  12.     typedef std::shared_ptr<Object> ObjectPtr;
  13.     ObjectPtr obj(new Object(1));
  14.     // 弱指针,我可能管理了资源 也可以没有管理资源
  15.     // 当外部被shared_ptr管理的时候 weak_ptr就是有效的,否则无效
  16.     // 有效或无效 完全依赖于外部的智能指针shared_ptr的 weak_ptr相当于一个监听者
  17.     typedef std::weak_ptr<Object> Object_weak_ptr;
  18.     Object_weak_ptr weak_obj(obj); //一般通过shared_ptr来构建weak_ptr
  19.     Object_weak_ptr weak_obj2(obj); // 并不影响引用的次数 因为你是弱的
  20.     printf("强弱智能指针对比:use_count()=%ld,%ld\n", obj.use_count(), weak_obj.use_count());

  21.     {
  22.         //如何使用weak_ptr 调用lock()方法
  23.         //返回的:如果weak_ptr有效则会创建一个新的shared_ptr 否则为nullptr
  24.         // 如果有效 相当于从weak_ptr转换为shared_ptr  从弱变强了
  25.         auto p = weak_obj.lock();
  26.         if (p)
  27.         {
  28.             printf("有效,p当成shared_ptr来使用,use_count()=%ld,%ld\n", p.use_count(), weak_obj.use_count());
  29.             /* weak_ptr是有效的 外部有其他shared_ptr也管理同一份资源 */
  30.         }
  31.         else
  32.         {
  33.             /* weak_ptr是无效的 */
  34.         }
  35.         // 注意细节:放语句块里 会自动析构p的
  36.     }
  37.     printf("析构p后恢复了:use_count()=%ld,%ld\n", obj.use_count(), weak_obj.use_count());

  38.     //obj.reset();  //shared_ptr脱离关系
  39.     obj.reset(new Object(2));  //先脱离 后创建一个新对象 不是同一份资源了 同时导致Object(1)析构 因为use_count=0了
  40.     printf("脱离关系之后的:\n");
  41.     {
  42.         auto p2 = weak_obj.lock();
  43.         if (p2)
  44.         {
  45.             printf("有效,p2当成shared_ptr来使用,use_count()=%ld\n", p2.use_count());
  46.             /* weak_ptr是有效的 外部有其他shared_ptr也管理同一份资源 */
  47.         }
  48.         else
  49.         {
  50.             printf("已经脱离关系了,weak_ptr是无效的,由弱转强失败了!\n");
  51.         }
  52.     }

  53.     weak_obj = obj;  // 用一个强指针去赋值给弱指针
  54.     printf("又让强弱智能指针管理同一份资源之后的:\n");
  55.     {
  56.         auto p2 = weak_obj.lock();
  57.         if (p2)
  58.         {
  59.             printf("有效,p2当成shared_ptr来使用,use_count()=%ld,%ld\n", p2.use_count(), weak_obj.use_count());
  60.             /* weak_ptr是有效的 外部有其他shared_ptr也管理同一份资源 */
  61.         }
  62.         else
  63.         {
  64.             printf("已经脱离关系了,weak_ptr是无效的,由弱转强失败了!\n");
  65.         }
  66.     }
  67.     printf("析构p2后恢复了:use_count()=%ld,%ld\n", obj.use_count(), weak_obj.use_count());

  68.     //如何通过weak_ptr判断外部是否有被shared_ptr管理的资源 不想通过weak_obj.lock()去创建一个新的shared_ptr
  69.     if(weak_obj.expired()){
  70.         printf("weak_ptr是无效的!\n");

  71.     }else{
  72.         
  73.         printf("该weak_ptr有被外部其他shared_ptr管理!\n");

  74.     }

  75. }



  76. int main(){
  77.     printf("智能指针shared_ptr与weak_ptr的完美结合使用.cpp\n");
  78.     // 极大的减少了内存泄露风险
  79.     shared_ptr_with_weak_ptr();
  80.     return 0;
  81. }
复制代码




weak_ptr.jpg
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

0

主题

98

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
发表于 2021-11-23 19:29:07 | 显示全部楼层
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-4-17 04:21 , Processed in 0.188384 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表