第一次在这里发帖,我不是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创建的内存。
我在做一些明显错误的事吗?知道可能会发生什么吗?
非常感谢任何帮助。
谢谢!
约翰
答案 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;