当前位置: 首页 > news >正文

【17】c++11新特性 —>弱引用智能指针weak_ptr(2)

返回管理this的shared_ptr

通过wek_ptr返回管理this资源的共享智能指针对象shared_ptr。C++11中为我们提供了一个模板类叫做std::enable_shared_from_this,这个类中有一个方法叫做shared_from_this(),通过这个方法可以返回一个共享智能指针,在函数的内部就是使用weak_ptr来监测this对象,并通过调用weak_ptr的lock()方法返回一个shared_ptr对象。

#include <iostream>
#include <memory>
using namespace std;struct Test : public enable_shared_from_this<Test>
{shared_ptr<Test> getSharedPtr(){return shared_from_this();}~Test(){cout << "class Test is disstruct ..." << endl;}
};int main()
{shared_ptr<Test> sp1(new Test);cout << "use_count: " << sp1.use_count() << endl;shared_ptr<Test> sp2 = sp1->getSharedPtr();cout << "use_count: " << sp1.use_count() << endl;return 0;
}

循环引用的案例

#include <iostream>
#include <memory>
using namespace std;struct TA;
struct TB;struct TA
{shared_ptr<TB> bptr;~TA(){cout << "class TA is disstruct ..." << endl;}
};struct TB
{shared_ptr<TA> aptr;~TB(){cout << "class TB is disstruct ..." << endl;}
};void testPtr()
{shared_ptr<TA> ap(new TA);shared_ptr<TB> bp(new TB);cout << "TA object use_count: " << ap.use_count() << endl;cout << "TB object use_count: " << bp.use_count() << endl;ap->bptr = bp;bp->aptr = ap;cout << "TA object use_count: " << ap.use_count() << endl;cout << "TB object use_count: " << bp.use_count() << endl;
}int main()
{testPtr();return 0;
}

修改

#include <iostream>
#include <memory>
using namespace std;struct TA;
struct TB;struct TA
{weak_ptr<TB> bptr;~TA(){cout << "class TA is disstruct ..." << endl;}
};struct TB
{shared_ptr<TA> aptr;~TB(){cout << "class TB is disstruct ..." << endl;}
};void testPtr()
{shared_ptr<TA> ap(new TA);shared_ptr<TB> bp(new TB);cout << "TA object use_count: " << ap.use_count() << endl;cout << "TB object use_count: " << bp.use_count() << endl;ap->bptr = bp;bp->aptr = ap;cout << "TA object use_count: " << ap.use_count() << endl;cout << "TB object use_count: " << bp.use_count() << endl;
}int main()
{testPtr();return 0;
}
http://www.lryc.cn/news/222601.html

相关文章:

  • 如何去除视频水印?三种简便有效的方法解决视频水印问题
  • 快速构建高质量中文APP登录注册页面Figma源文件
  • MySQL库的库操作指南
  • 【单目测距】单目相机测距(三)
  • Evaluating Large Language Models: A Comprehensive Survey
  • ElasticSearch 实现 全文检索 支持(PDF、TXT、Word、HTML等文件)通过 ingest-attachment 插件实现 文档的检索
  • 【Head First 设计模式】-- 策略模式
  • 能链智电,“重”症在身
  • python 视频硬字幕去除 内嵌字幕去除工具 vsr
  • 蓝桥等考C++组别六级004
  • SpringBoot之Swagger
  • 抖音小店新的流量变现新时代!
  • 软件架构师
  • postman接口测试
  • 技术分享 | web自动化测试-PageObject 设计模式
  • Mall4cloud 微服务商城系统 2.0 发布
  • SpringBoot进制转换规则问题
  • 12.输入一个小于1000的整数,输出平方根(不是整数,输出整数部分)
  • Django框架的推导
  • 广东开放大学:电大搜题助力学子迎考利器
  • linux 7za 编译安装
  • 【Edge】微软Edge每次启动自动导入Chrome收藏夹,无法取消“每次启动浏览器时导入浏览数据”功能的解决方法(202311)
  • 报错RuntimeError: no valid convolution algorithms available in CuDNN
  • JSP通用材料收集归档系统eclipse定制开发mysql数据库BS模式java编程jdbc
  • 网络安全-零基础小白自学要点
  • SpringCloud——服务注册——Eureka
  • 大模型时代的编码习惯
  • 程序员怎样才能学好算法?这本书送几本给大家!
  • 2023-11-08 monetdb-事务-只有RR隔离级别-原因分析
  • 微信小程序:怎么在一个js中修改另一个js的数据(这里通过缓存进行实现)