2

我在这里有一些代码,其中有一组“培根”对象。我可以编译并运行它并将对象添加到数组中,但是当我使数组大小超过一百万时,我运行它并显示“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;
}
4

4 回答 4

6

您的计算机有足够的内存,但只能在堆栈上分配这么多内存。尝试在堆上分配它:

Bacon **bacs = new Bacon*[objs];

然后:

delete[] bacs;
于 2013-05-04T21:40:19.607 回答
1

你可能没有堆栈空间。

您在堆栈上分配大量指针。堆栈是有限的资源(通常每个进程 8 兆字节)。指针大小通常为 4 或 8 字节;将它乘以一百万,你就超出了这个限制。

于 2013-05-04T21:40:24.420 回答
0

据我所知,当您从内存中请求空间时,如果您使用的操作系统(我认为在这种情况下是 Windows)允许您占用它,您就可以占用并使用该空间。

出于某种原因,Windows 可能不允许您在这种情况下占用该内存。但我在这个领域并不是那么专家。我把这当作一个想法来说明。

于 2013-05-04T21:49:26.467 回答
0

默认堆栈大小(Windows Visual Studio 2005,可能其他人保持相同的数字)为 1MB,请查看http://msdn.microsoft.com/en-us/library/tdkhxaks%28v=vs.80%29.aspx到更改

ulimit 在 linux 中进行更改。

堆解决方案也有效,但在您的示例中,您不需要堆。向操作系统请求堆内存以获取不会逃避当前功能的东西不是一个好习惯。在汇编程序中,堆栈被转换为更大的减法,通过其他需要更多处理的方法请求堆。

于 2013-05-04T21:51:30.490 回答