1

私は自分の単語検索アルゴリズムに取り組んできました。それは完全に機能しますが、10000 x 10000 のような非常に大きなパズルでテストすることにしました。これは、シンボルで満たされたマトリックスです。それで、そのパズルを作る小さなプログラムを作成しました。そして、単語検索を実行すると、bad_alloc でクラッシュしました。私は2D配列を使用しています。コード:

        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

std::string クラスは、デバッグ ビルドのクラス オブジェクトだけで 28 バイトです。実際の文字列に必要なストレージはカウントされません。したがって、プログラムは 10000 x 10000 x 28 = 2.8 ギガバイトを割り当てます。Windows の 32 ビット プロセスは、ギブまたはテイクで 2 ギガバイト以上を割り当てることができません。その制限をはるかに超えています。

よりスマートなコードを記述するか、64 ビット コード生成に切り替える必要があります。先に進むための明白な方法は、単語検索プログラムが必要とするのは文字列全体ではなく、セルごとに 1 文字だけであることを理解することです。したがって、 Acharで十分です。または、グリッドの行全体を単一の std::string に格納します。メモリ要件を簡単に 2 桁削減します。

于 2013-11-03T20:09:44.987 に答える