【发布时间】: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 Ask 和help center 了解如何提问。 MCVE 会有所帮助,您当前的代码是不可编译的,除了其他明显的错误。我建议阅读 How to Debug Small Programs 以更好地了解如何调试它。
标签: c++ c++11 memory-management vector shared-ptr