c++的std::shared_ptr,当同时创建几万个时,然后一起释放,为什么内存不会减少?
测试发现:当数量小于1万时能正常释放,当数量在4万时内存只释放一半,当数量为5万时内存全部不释放,内存没有释放的情况下再创建小于5万个智能指针时,内存不会增加
std::shared_ptr
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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无用
悬赏问题
- ¥15 做个有关计算的小程序
- ¥15 MPI读取tif文件无法正常给各进程分配路径
- ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
- ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
- ¥15 setInterval 页面闪烁,怎么解决
- ¥15 如何让企业微信机器人实现消息汇总整合
- ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
- ¥15 如何用Python爬取各高校教师公开的教育和工作经历
- ¥15 TLE9879QXA40 电机驱动
- ¥20 对于工程问题的非线性数学模型进行线性化