[英]C++ loop memory error?
我这里有一些代码,其中有一个“培根”对象数组。 我可以编译并运行它并将对象添加到数组中,但是当我使数组大小超过一百万时,我运行它并且它说'bacon.exe已停止工作'并且我必须关闭它。 我认为这可能是内存泄漏,但是我仍在学习中。 我正在使用netbeans ide,并且在编译时尝试分配更多的内存,但是我不知道该怎么做。 注意:这不是因为我的整个计算机内存不足,是因为运行该程序后仍有2GB可用空间。 这是我的代码:
#include <iostream>
#include "Bacon.h"
using namespace std;
int main() {
const int objs = 1000000;
Bacon *bacs[objs];
for(int i = 0;i < objs;i++){
bacs[i] = new Bacon(2,3);
}
for(int i = 0;i < objs;i++){
bacs[i]->print();
}
cin.ignore();
return 0;
}
您的计算机有足够的内存,但只有很多内存可以在堆栈上分配。 尝试在堆上分配它:
Bacon **bacs = new Bacon*[objs];
然后:
delete[] bacs;
你可能没有堆栈空间了。
你在堆栈上分配了大量的指针。 堆栈是有限的资源(通常每个进程8兆字节)。 指针大小通常为4或8个字节; 将它乘以一百万,你就超过了这个限制。
据我所知,当你从内存中请求空间时,如果您使用的操作系统(我认为是Windows),您可以使用它,您可以使用该空间。
出于某种原因,Windows可能不会让你为这种情况占用内存。 但是我在这个领域不是那么多专家。 我说这是一个想法。
默认的堆栈大小(windows visual studio 2005,可能是其他人保持相同的数字)是1MB,请查看http://msdn.microsoft.com/en-us/library/tdkhxaks%28v=vs.80%29.aspx到更改
在Linux中使用ulimit进行更改。
堆解决方案也是有效的,但是在您的示例中,您不需要堆。 向操作系统请求堆内存以获取不会逃避当前函数的操作并不是一种好习惯。 在汇编程序中,堆栈被转换为更大的减法,通过需要更多处理的其他方法请求堆。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.