鱼C论坛

 找回密码
 立即注册
查看: 1520|回复: 1

[已解决]vector里存放共享指针,需要手动删除吗

[复制链接]
发表于 2023-9-21 15:35:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <iostream>
  2. #include <vector>
  3. #include <memory>

  4. struct Object{
  5.     int a=0;
  6. };

  7. struct TrackedObject{
  8.     int b = 0;
  9.     std::shared_ptr<Object> objectptr;

  10. };
  11. typedef std::shared_ptr<TrackedObject> TrackedObjectPtr;

  12. int main(){
  13.     std::vector<TrackedObjectPtr> tracked_objects;

  14.     tracked_objects.clear();
  15.    
  16.     return 0;
  17. }
复制代码


如上,我有一个vector,里面存放的是share_ptr,使用完成之后,只将tracked_objects 给clear了是否可行,还是需要对共享指针也做删除。
如果需要删除共享指针,应该怎样手动删除,才能完整的删除vector并保证内存不泄漏呢?
最佳答案
2023-9-21 15:35:23
需要手动删除共享指针,否则会发生内存泄漏。在vector中存放的是shared_ptr,当vector被清空时,它所包含的shared_ptr只是减少了引用计数,而指向的内存空间仍然存在,如果没有其他地方引用该内存空间,就会发生内存泄漏。

正确的做法是在vector被清空时,遍历vector中的每一个shared_ptr,将其reset为nullptr,这样可以将引用计数减少到0,从而释放所指向的内存空间。代码如下:

  1. for (auto& ptr : tracked_objects) {
  2.     ptr.reset();
  3. }
  4. tracked_objects.clear();
复制代码


这样就可以完整的删除vector并保证内存不泄漏。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-9-21 15:35:23 | 显示全部楼层    本楼为最佳答案   
需要手动删除共享指针,否则会发生内存泄漏。在vector中存放的是shared_ptr,当vector被清空时,它所包含的shared_ptr只是减少了引用计数,而指向的内存空间仍然存在,如果没有其他地方引用该内存空间,就会发生内存泄漏。

正确的做法是在vector被清空时,遍历vector中的每一个shared_ptr,将其reset为nullptr,这样可以将引用计数减少到0,从而释放所指向的内存空间。代码如下:

  1. for (auto& ptr : tracked_objects) {
  2.     ptr.reset();
  3. }
  4. tracked_objects.clear();
复制代码


这样就可以完整的删除vector并保证内存不泄漏。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 06:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表