矢量存储限制的向量 - 获得"Microsoft C++ exception: std::bad_alloc at memory location 0x0031650C."错误

Vector of vector storage limitations - getting "Microsoft C++ exception: std::bad_alloc at memory location 0x0031650C." error

本文关键字:bad std alloc at 错误 0x0031650C location memory exception C++ 存储      更新时间:2023-10-16

在c++中,我正在阅读几个大型网格数据集进行处理。最近,其中一个数据集甚至在我开始处理之前就破坏了我的代码。

数据集有5765个cols和5872行,总共有33852080个单元格。在单个向量的容量极限下,对吧?或不呢?我现在正在想办法。

试图将第2496个内部向量push_back放入原始向量时抛出异常。

代码如下:

slopeGrid.reserve(rows);  
flowDirGrid.reserve(rows);     
flowAccumGrid.reserve(rows);  
tempGrid.reserve(rows);
inflowGrid.reserve(rows);
TWIgrid.reserve(rows);

for(int k=0; k<rows; k++)
{
    elevation.push_back(*new vector<double>(cols));
    ATB.push_back(*new vector<double>(cols));
    Area.push_back(*new vector<double>(cols));
    slopeGrid.push_back(*new vector<double>(cols));   
    flowDirGrid.push_back(*new vector<double>(cols));     
    flowAccumGrid.push_back(*new vector<double>(cols));   
    tempGrid.push_back(*new vector<double>(cols));
    inflowGrid.push_back(*new vector<double>(cols));
    TWIgrid.push_back(*new vector<double>(cols));
}

你有3400万个对象,对吧?如果这些对象足够大,我认为达到每个Windows 32位进程最大2g不会那么困难。

效果:

我仍然遇到内存异常时,已经删除了动态分配,并使用以下格式:

elevation.resize(rows, std::vector<double>(cols, NODATA));

但是,根据Tive的回答,我能够找到并遵循这个:

https://msdn.microsoft.com/en-us/library/wz223b1z.aspx

然后它就能正常工作了