我有以下代码抛出std::bad_alloc
异常:
std::vector<std::vector<double>> myVector(nlines);
for(int i = 0; i < nlines; i++)
{
try
{
std::vector<double> iVector(ncolumns);
myVector[i] = iVector;
}
catch (std::exception& e)
{
/* catches a bad_alloc here */
}
}
}
当nlines
约为500,000(ncolumns
通常小于10)时,此代码似乎有效,但当我在nlines
= 2,600,000 I的全尺寸数据集上尝试此操作时得到bad_alloc异常。
我有12 GB的内存并在运行程序时查看我的内存使用量,从28%(开始之前)到42%(抛出异常时)。所以看起来我还有记忆。
我发现this post表示向量在堆上分配内存。根据链接到this post的this MSDN page,我可以设置我的代码可以使用的堆的数量(以字节为单位)。最初,堆提交大小和堆保留大小为空白。当我输入2000000000(2 GB)的值时,我仍然遇到同样的问题。
为了使事情变得更有趣,使用来自C#.NET应用程序的互操作来调用此C ++代码(而不是CLI)。对堆大小提交大小和堆保留大小的修改是在C ++项目上设置的。我不知道我是否还需要在.NET项目中设置这些项目或者我将如何设置它们。
任何建议或帮助都将不胜感激。
答案 0 :(得分:1)
正如Neil Kirk指出的那样,32位进程仅限于2GB内存,如this MSDN page中所述。这适用于无人管理和托管应用程序。
有很多关于此的问题,例如我找到了这些:
How much memory can a 32 bit process access on a 64 bit operating system?
The maximum amount of memory any single process on Windows can address
在我的情况下,我认为.NET和非托管代码之间的互操作正在进行一些缓冲,因此占用了可用内存。理想情况下,我应该只有两个或三个2,600,000 x 10个元素的2D向量(如果一个双精度是8个字节,那么这仍然小于1 GB)。我需要进一步调查。