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

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 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化