C++0xC0000005:试图生成大向量[180][360]

C++ 0xC0000005: Trying to make large vector[180][360]

本文关键字:向量 C++0xC0000005      更新时间:2023-10-16

我很难让我的计算机分配大量内存(在我机器上的32GB以内)。我在Visual Studio 2015中,在64位计算机上以x64的形式运行目标,所以应该没有内存限制。

最初我尝试制作vector<int> my_vector[4][180][360],结果导致堆栈溢出。

根据VisualStudio调试器的说法,内存使用量不会超过70MB,所以我很好奇内存问题是如何发生的。计算机上的内存使用量保持在25GB以上。

有没有任何方法可以在没有内存问题的情况下声明vector<int> my_vector[4][180][360]这样的数组向量?到目前为止,我只能达到v[180][180]那么高。我的大多数向量都只有很少的元素。非常感谢您的帮助,谢谢。

    static std::vector<int> my_vector[4][180][360];
    for (int i=0; i < 4; i++)
        for (int j=0; j < 180; j++)
            for (int k=0; k < 36; k++)
                my_vector[i][j][k].resize(90000);
     my_vector[1][2][3][4]=99;

这在我的24gb机器上通过创建虚拟到磁盘来工作。但它很可能会很慢。您最好为磁盘文件编制索引。

您还可以使用std::map创建稀疏数组>

     static std::map<int,int> my_map[4][180][360];
     my_map[1][2][3][4]=99;

是否在堆栈上分配内存?如果是这样的话,我相信在出现堆栈溢出错误之前是有限制的。对于Visual Studio 2015,我认为默认的堆栈大小是1MB。

对于较大的数组,您需要使用new关键字在上分配它们。

如果您试图分配一个多维数组,它可能会变得相当复杂。二维整数数组被动态分配为指针的数组,每个指针都被分配给新的整数数组。在一个幼稚的版本中,您将需要一个循环来分配(并最终解除分配):

int **a= new int*[1000];
for (i = 0;  i< 1000; i++) {
   a[i] = new int[1000];
}

正如您所看到的,多维变得更加复杂,并且会占用额外的内存来存储指针。但是,如果您知道元素的总数,您可以只分配一个数组来存储所有元素(对于我的1000x1000示例为100000),并相应地计算每个元素的位置。

我把剩下的留给你去想。。。