矢量std :: shared_ptr没有释放内存

时间:2014-05-07 14:57:48

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

第一次在这里发帖,我不是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类​​创建了一个std :: shared_ptrs到A的向量并返回它。然后,我将这些局部向量组合成一个名为myfunc的函数中的大型全局向量。为了测试当我想缩小globA的大小时释放内存,我调用globA.clear()和globA.shrink_to_fit()。

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

我在做一些明显错误的事吗?知道可能会发生什么吗?

非常感谢任何帮助。

谢谢!

约翰

1 个答案:

答案 0 :(得分: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;