【发布时间】:2014-06-28 13:32:57
【问题描述】:
我目前在用数据声明或填充大型数组时遇到问题,因为我收到一个对话框,提示“内存不足”,源自 CMemoryException。
我正在尝试创建一个包含大约 50000 个对象元素的数组或向量(两者都尝试过),其中 sizeof(MyObjectClass) 返回大约 37000 个字节。
如果我尝试逐个元素地填充向量或 CArray,那么我会在出现内存不足异常之前先填充近 16000 个元素。那应该接近 600MB?
我的机器上有 8GB RAM,根据 Windows 任务管理器,只有 4GB 正在使用。因此,物理 RAM 的数量不应成为问题。我在 Visual Studio 2010 32 位中运行 C++ MFC。
如果我尝试写作
MyObjectClass* heaparray = new MyObjectClass[50000];
然后我立即在该行上遇到同样的内存不足错误。
有什么想法吗? 提前谢谢你!
更新: 我也尝试过简单地创建一个带有字段的 TestStruct:
struct TestStruct
{
long long field1;
GUID field2;
GUID field3;
GUID field4;
TCHAR field5[256];
TCHAR field6[4];
TCHAR field7[258];
TCHAR field8[1026];
TCHAR field9[258];
TCHAR field10[16386];
TCHAR field11[258];
};
TestStruct* heapArr = new TestStruct[50000];
还是一样...执行最后一行代码时出现“内存不足”异常。 在处理大数据时,堆的好处之一不应该是仅受 RAM(或多或少)的限制。然而......因为它已经在 600MB 的分配空间时崩溃了,所以我不能同意这是非常大的数据......或者我应该吗? :/
【问题讨论】:
-
MyObjectClass 是什么样的?
-
在 32 位编译器上分配超过 4GB 的可能性不大
-
如果每个 obj 真的是 37000 字节,那么您至少需要 1764.16 MB
-
另外,您正在请求大量连续内存,即使您有大量物理内存也无法使用
-
即使您使用的是 64 位操作系统并拥有 8GB 内存,默认情况下,32 位用户模式进程也只能访问 2GB 内存。见:this question。你不能把你的程序编译成 x64 版本吗?