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

《C++智能指针:建议使用 make_shared 代替 shared_ptr》

《C++ 智能指针:长达数十年的血泪史,一步步征服内存泄漏》-CSDN博客

	shared_ptr<int> sp1(new int(10));

这句代码实际存在两个内存开辟,一是开辟我们要托管的内存资源 ,二是开辟引用计数的资源,引用技术也是new出来的。它们两个是单独new出来的,在不同的内存空间。

如果new int(10)成功了,new引用计数没有成功,那么就意味着shared_ptr对象创建失败了!就不会调用析构函数再释放资源了。所以就会导致资源泄漏,存在这个风险。

	shared_ptr<int> sp2 = make_shared<int>(10);
	// auto sp2 = make_shared<int>(10);

把我们需要托管的内存资源和存储引用计数的内存资源一起开辟了,在一块内存上,去new一次!所以,要么都开辟成功,要么都开辟失败,如果失败了,由于不存在资源的开辟即不存在资源的泄漏。

优点:

  • 内存分配效率高
  • 防止资源泄漏的风险

缺点:

  • 无法自定义删除器
  • 导致托管的资源延迟释放

理解shared_ptr托管资源延迟释放的问题

  • 如果为shared_ptr

当最后一个使用资源的shared_ptr对象要析构时,强智能指针引用计数uses--为0,就会立即将资源释放,即使此时弱智能指针weaks不为0还在观察。因为托管的资源和存储引用计数的资源不在同一块内存。

  • 如果为make_shared

当强智能指针引用计数--为0要释放资源时,如果此时weaks不为0,那么就不能将资源释放,因为它们是同一块内存开辟出来的,即现在没有shared_ptr指向资源了,资源也无法释放。只有当weaks也为0时,才能将资源释放。

使用C++14make_shared代替shared_ptr,使用C++14make_unique代替unique_str。

相关文章:

  • PostgreSQL 数据库源码编译安装全流程详解 Linux 8
  • SysVinit和Systemd的系统运行级别
  • 探秘 WRF DA:多维度剖析其在气象研究中的卓越效能
  • C++具名转型的功能和用途
  • 奇怪的异形选项卡样式、弧形边框选项卡
  • Go语言中package的使用规则《二》
  • java基础之windows电脑基础命令
  • 【其他】在线安装DataEase后无法远程访问
  • k近邻图(knn-graph)和局部线性嵌入图(LLE-graph)的相似性和区别
  • Python JSON模块loads、load、dump、dumps详解
  • Sql Server 索引性能优化 分析以及分表
  • 【LeetCode】大厂面试算法真题回忆(37)--知识图谱新词挖掘
  • 大数据从入门到入魔系列————探索大数据前世今生之迷
  • Unity | 游戏数据配置
  • SpringBoot整合MQTT最详细版(亲测有效)
  • 创建自己的github.io
  • Jmeter插件下载和配置
  • 终端的命令行发送邮件的方式和监视脚本
  • windows专用网路的共享文件配置
  • EtherCAT转profinet网关集成汽车变速箱制造生产线自动化升级
  • 今年一季度全国城镇新增就业308万人,就业形势保持总体稳定
  • 西湖大学独家回应本科招生走出浙江:经过三年试点,条件成熟
  • 论法的精神︱张玉敏:知识产权保护要为社会经济文化发展服务
  • 幸福航空五一前三天航班取消:客服称目前是锁舱状态,无法确认何时恢复
  • 三杀皇马剑指四冠,硬扛到底的巴萨,赢球又赢人
  • 李良生已任应急管理部党委委员、政治部主任