凌竹 2023-04-03 11:16 采纳率: 50%
浏览 14
已结题

std::shared_ptr

c++的std::shared_ptr,当同时创建几万个时,然后一起释放,为什么内存不会减少?
测试发现:当数量小于1万时能正常释放,当数量在4万时内存只释放一半,当数量为5万时内存全部不释放,内存没有释放的情况下再创建小于5万个智能指针时,内存不会增加

  • 写回答

2条回答 默认 最新

  • 社区专家-Monster-XH 2023-04-03 12:55
    关注

    基于Monster 组和GPT的调写:

    • std::shared_ptr 是一种智能指针,用于管理动态分配的对象的生命周期。当所有指向一个对象的 shared_ptr 都被销毁时,该对象会被自动删除。但是,在创建大量 shared_ptr 的情况下,可能会发生内存泄漏的问题,即使 shared_ptr 已经被销毁,分配的内存可能仍然没有被释放。
    • 这种情况可能是由于 shared_ptr 内部维护了一个计数器,用于记录指向同一个对象的 shared_ptr 的数量。当计数器降为零时,shared_ptr 会自动释放分配的内存。但是,由于计数器是一个原子操作,当创建大量 shared_ptr 时,同步开销可能会变得很大,从而导致内存释放的延迟。
    • 另外,内存管理器也可能会影响 shared_ptr 的内存释放行为。一些内存管理器可能会在内存使用过多时延迟释放内存,以提高性能。这可能会导致 shared_ptr 释放内存的延迟。
    • 在你的测试中,当数量小于1万时,内存正常释放,这是因为计数器的同步开销和内存管理器的影响并不明显。但是,当数量增加到4万或5万时,同步开销变得更大,内存管理器的影响也变得更加明显,导致内存释放的延迟。
    • 如果你想确保在大量创建 shared_ptr 的情况下不会出现内存泄漏,可以考虑以下几种解决方案:
    • 使用 std::make_shared 函数,它可以在单次内存分配中同时分配 shared_ptr 对象和动态分配的对象,从而减少同步开销和内存管理器的影响。
    • 使用 std::shared_ptr 的重载构造函数,可以指定一个自定义的删除器,用于在所有 shared_ptr 都被销毁时释放动态分配的对象。
    • 使用其他的智能指针,如 std::unique_ptr,它不需要维护计数器,从而避免同步开销。
    • 避免同时创建大量 shared_ptr,尽量采用其他的内存管理技术,如内存池或对象池,来避免频繁的内存分配和释放。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月11日
  • 已采纳回答 4月3日
  • 创建了问题 4月3日

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加