2

「ベーコン」オブジェクトの配列があるコードがいくつかあります。コンパイルして実行し、配列にオブジェクトを追加することはできますが、配列のサイズが 100 万を超えると、実行すると「bacon.exe が動作を停止しました」と表示され、閉じる必要があります。メモリ リークの可能性があると思いますが、それについてはまだ学習中です。私は netbeans ide を使用しており、コンパイル時にさらに多くのメモリを割り当てようとしましたが、その方法がわかりませんでした。注: プログラムを実行した後、まだ 2GB の空き容量があるため、コンピューター全体のメモリが不足しているからではありません。これが私のコードです:

#include <iostream>
#include "Bacon.h"
using namespace std;

int main() {
    const int objs = 1000000;
    Bacon *bacs[objs];
    for(int i = 0;i < objs;i++){
        bacs[i] = new Bacon(2,3);
    }
        for(int i = 0;i < objs;i++){
        bacs[i]->print();
    }
    cin.ignore();
    return 0;
}
4

4 に答える 4

6

コンピューターには十分なメモリがありますが、スタックに割り当てることができるメモリは限られています。代わりにヒープに割り当ててみてください。

Bacon **bacs = new Bacon*[objs];

以降:

delete[] bacs;
于 2013-05-04T21:40:19.607 に答える
1

おそらくスタックスペースが不足しています。

スタック上にポインタの巨大な配列を割り当てます。スタックは限られたリソースです (通常、プロセスごとに 8 メガバイト)。ポインターのサイズは通常 4 または 8 バイトです。それを 100 万倍すると、その制限を超えてしまいます。

于 2013-05-04T21:40:24.420 に答える
0

私が学んだように、メモリからスペースを要求するとき、使用しているオペレーティング システム (この場合は Windows だと思います) がそれを取得できる場合は、そのスペースを取得して使用できます。

何らかの理由で、Windows では、この状況でそのメモリを使用できない場合があります。しかし、私はこの分野の専門家ではありません。私はこれを考えとして述べています。

于 2013-05-04T21:49:26.467 に答える
0

デフォルトのスタック サイズ (Windows Visual Studio 2005、おそらく他のものも同じ数) は 1MBですそれを変更

Linux で ulimit を変更してください。

ヒープ ソリューションも有効ですが、この例ではヒープは必要ありません。現在の関数をエスケープしないもののために、OS にヒープ メモリを要求することはお勧めできません。アセンブラーでは、スタックはより大きな減算に変換され、より多くの処理を必要とする他のメソッドを介してヒープが要求されます。

于 2013-05-04T21:51:30.490 に答える