C++在堆上分配大型数组会产生"内存不足异常"

101*_*001 2 c++ memory arrays

我目前在使用数据声明或填充大型数组时遇到问题,因为我得到一个"内存不足"的对话框,源自CMemoryException.

我试图用一个对象的大约50000个元素创建一个数组或向量(试过两个),其中sizeof(MyObjectClass)返回大约37000个字节.

如果我尝试按元素填充向量或CArray元素,那么在获取Out Of Memory异常之前,我会在16000个元素附近填充.那应该接近600MB?

我在机器上有8GB RAM,根据Windows任务管理器只使用4GB.因此物理RAM的数量不应该带来问题.我在Visual Studio 2010中运行C++ MFC,32位.

如果我试着写

MyObjectClass* heaparray = new MyObjectClass[50000];
Run Code Online (Sandbox Code Playgroud)

然后我立即在那一行上得到了同样的内存不足错误.

有任何想法吗?先感谢您!

更新:我还尝试使用以下字段创建一个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];
Run Code Online (Sandbox Code Playgroud)

仍然相同...执行最后一行代码时出现"Out of Memory"异常.在处理大数据时,堆不应该只是由RAM(或多或少)限制的可能性之一.然而......因为它已经在600MB的分配空间崩溃了,我不能同意这是非常大的数据......或者我应该?:/

Cor*_*y-G 5

这是一个有趣的.两个矢量和阵列连续存储在内存中陈述这里.

你不仅在内存中寻找1850000000 bytes(1.72295 gigabytes),而且还有一大块不间断的内存.这很难找到.如果切换到不执行连续存储的不同数据结构(比如链接列表),那么您可以存储那么多.

注意:这也会使每个对象变得更大.

什么是最好的是看是否有任何方法来缓冲对象; 只加载你要更新的那些,并在需要时动态加载其他的.我怀疑你一次只能在多个CPU上进行cpu操作.如果你做得对(最有可能穿线)你甚至不会因读/写它们而受到任何影响.

有关您正在进行的工作的更多信息将会有所帮助.如果对象的变量小于2,147,483,647(int的大小),甚至可能有一种方法可以让数组填充类型标识符.你可以存储一个可以从中生成类的整数数组(toHash和fromHash,这将是50000*4字节= 195.312千字节),这也可能对你有用.同样,这取决于你正在做什么.