【问题标题】:Vector of std::shared_ptr not freeing memorystd::shared_ptr 的向量未释放内存
【发布时间】:2014-06-24 15:18:50
【问题描述】:

第一次在这里发帖,我不是CS人,所以请多多包涵。我有一个大小合适的代码,所以我将在下面发布我的问题的基本版本,然后解释它。

#include <vector>
#include <memory>

class A{

public: 
  A(){};
  double dbl[20];
};

typedef std::shared_ptr<A> A_ptr;

class B{
  public:
  const std::vector<A_ptr> createAVector(){
    std::vector<A_ptr> vec;
    for(int i=0; i<4; i++){
      vec.push_back(A_ptr( new A() ));
    }
    return vec;
  }
};

int myfunc(){

  // Do Stuff...

  std::vector<A_ptr> globvec;

  B b;
  for(int i=0; i<1e6; i++){
    const std::vector<A_ptr> locvec = b.createAVector();

    for(int i=0; i<locvec.size(); i++) globvec.push_back(locvec[i]);

  }

  globvec.clear();
  globvec.shrink_to_fit();

  // Do more stuff...

  return 1;
}


int main(){

  myfunc();

  for(auto i=0; i<3; i++){
    myfunc();
  }
  return 1;
}

编辑:我修改了代码,所以它实际上可以编译。

所以,基本上我有两个课程。 A 类存储实际数据。除其他外,B 类为 A 创建一个 std::shared_ptrs 向量并将其返回。然后我在一个名为 myfunc 的函数中将这些局部向量组合成一个大的全局向量。为了测试当我想缩小 globA 的大小时是否释放了内存,我调用了 globA.clear() 和 globA.shrink_to_fit()。

问题是调用 clear() 和 shrink_to_fit() 不会释放所有 A 创建的内存。

我在这里做了什么明显错误的事情吗?知道会发生什么吗?

任何帮助将不胜感激。

谢谢!

约翰

【问题讨论】:

  • 您确定您发布的代码存在问题吗?似乎您可能已经简化了问题。此外,发布一个独立的、可编译的示例也很有帮助。您这里的代码无法编译。
  • 我没有看到任何可能表明内存没有被释放的东西。是什么让你觉得有问题?
  • 您是如何确定并非所有As 都被删除的?
  • 如果您正在检查任务管理器或类似的内存使用情况,释放分配不一定会出现在那里。 C++ 运行时通常会在释放后保留内存。
  • 欢迎来到 SO。请阅读How to Askhelp center 了解如何提问。 MCVE 会有所帮助,您当前的代码是不可编译的,除了其他明显的错误。我建议阅读 How to Debug Small Programs 以更好地了解如何调试它。

标签: c++ c++11 memory-management vector shared-ptr


【解决方案1】:

您的代码很好。您基本上可以“证明”您没有泄漏 A 对象...(我还必须从 1e6 减少迭代次数以获得任何合理的运行时间)。

有更复杂的工具可用于查找内存泄漏。我知道对于 Linux,我们使用 Valgrind。但是,我不知道 Windows 等效项是什么。

class A{

public: 
  A() { std::cout << "Created A " << ++num_instances << std::endl;}
  ~A() { std::cout << "Destroyed A " << --num_instances << std::endl;}

  static int num_instances; // So not thread-safe

  double dbl[20];
};

int A::num_instances = 0;

【讨论】:

  • 使用 InterlockedIncrement() 和 InterlockedDecrement() 而不是 ++ 和 -- 这样对于多线程环境会更安全一些。
猜你喜欢
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 2017-01-11
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多