1

我一直在研究我的单词搜索算法。它工作得很好,但后来我决定在像 10000 x 10000 这样的非常大的谜题上进行测试,它是一个充满符号的矩阵。所以创建了一个小程序来解决这个难题。然后我运行单词搜索,它与 bad_alloc 一起崩溃。我使用二维数组。代码:

        string ** Matrix = new string*[Height];

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

高度 = 宽度 = 10000;

我不知道为什么会这样。我已经读过 new 并没有真正的限制,那么为什么它会崩溃?

顺便说一句,我打开 Windows 任务管理器只是为了好玩,而程序尝试分配内存并且内存上升到 2m+ 然后它崩溃了。

4

1 回答 1

6

对于 Debug 构建中的类对象,std::string 类是 28 个字节。不计算实际字符串所需的任何存储空间。因此,您的程序分配 10000 x 10000 x 28 = 2.8 GB。Windows 中的 32 位进程不能分配超过 2 GB 的空间,无论是给予还是索取,你都远远超过了这个限制。

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

于 2013-11-03T20:09:44.987 回答