Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取错误的\u alloc错误_C++_Arrays - Fatal编程技术网

C++ 获取错误的\u alloc错误

C++ 获取错误的\u alloc错误,c++,arrays,C++,Arrays,我一直在研究我的单词搜索算法。它工作得很好,但后来我决定测试一个非常大的谜题,比如10000 x 10000,它是一个充满符号的矩阵。于是,我们制作了一个小程序,制作了这个拼图。然后我运行了单词搜索,结果坏了。 我使用二维数组。 代码: string**Matrix=新字符串*[Height]; 对于(int i=0;i

我一直在研究我的单词搜索算法。它工作得很好,但后来我决定测试一个非常大的谜题,比如10000 x 10000,它是一个充满符号的矩阵。于是,我们制作了一个小程序,制作了这个拼图。然后我运行了单词搜索,结果坏了。 我使用二维数组。 代码:

string**Matrix=新字符串*[Height];
对于(int i=0;i
高度=宽度=10000

我不知道为什么。我读过一篇文章,说new没有真正的限制,为什么它会崩溃呢


顺便说一句,只是为了好玩,当程序试图分配内存时,我打开了windows任务管理器,内存增加到2m以上,然后它崩溃了。

对于调试版本中的类对象,std::string类只有28字节。不计算实际字符串所需的任何存储。因此,您的程序分配10000 x 10000 x 28=2.8 GB。Windows中的32位进程不能分配超过2G字节的内存,不管付出与否,都远远超过了这个限制


您需要编写更智能的代码或切换到64位代码生成。一个明显的方法是认识到单词搜索程序只需要每个单元格一个字符,而不是整个字符串。因此,一个
char
就足够了。或者将整个网格行存储到单个std::字符串中。将内存需求减少两个数量级

std::string类对于调试构建中的类对象只有28个字节。不计算实际字符串所需的任何存储。因此,您的程序分配10000 x 10000 x 28=2.8 GB。Windows中的32位进程不能分配超过2G字节的内存,不管付出与否,都远远超过了这个限制


您需要编写更智能的代码或切换到64位代码生成。一个明显的方法是认识到单词搜索程序只需要每个单元格一个字符,而不是整个字符串。因此,一个
char
就足够了。或者将整个网格行存储到单个std::字符串中。将内存需求减少两个数量级

你在泄漏内存,就是这样。事实上,如果你得到矩阵的大小,然后乘以字符串的大小(即HeightWidthsizeof(string)),我认为操作系统不会让你分配那么多内存。你的意思是“内存增加到2m+”或者2G。计算你认为数组应该占用多少内存。不要使用任务管理器。一定要使用
std::vector
。在一台像样的计算机上分配80000000/160000000字节应该不会有问题,除非你打开了很多程序。确保你的编译器正在生成64位可执行文件。标记,我的意思是在任务管理器中在进程旁边,它显示用户名、cpu和内存,增加到2.000.000+KYou正在泄漏内存,就是这样。事实上,如果你得到矩阵的大小,然后乘以字符串的大小(即HeightWidthsizeof(string),我想操作系统不会让你分配那么多内存。你的意思是“内存增加到2m+”或者2G。计算你认为数组应该占用多少内存。不要使用任务管理器。一定要使用
std::vector
。在一台像样的计算机上分配80000000/160000000字节应该不会有问题,除非你打开了很多程序。确保你的编译器正在生成64位可执行文件。标记,我的意思是在任务管理器中在进程旁边,它显示用户名、cpu和内存,最高可达2.000.000+K
        string ** Matrix = new string*[Height];

        for(int i = 0; i < Height; ++i)
        {
            Matrix[i] = new string[Widht];
        }