0

こんにちは、不要なメモリを大量に消費するループを含む C++ プログラムをコーディングしているため、最後に到達する前にコンピューターがフリーズします...

このループは次のようになります。

float t = 0.20;
while(t<0.35){
    CustomClass a(t);
    a.runCalculations();
    a.writeResultsInFile("results_" + t);
    t += 0.001;
}

t関連する場合、プログラムは、温度と呼ばれる外部パラメーターのいくつかの値の結果が必要な物理シミュレーションです。メモリの過剰は、クラスのインスタンスがループの1回の実行から次の実行までに使用するスペースを「解放」しないことが原因のnewようです。クラスのデストラクタでやってみましたが、役に立ちませんでした。私のクラスのメインメモリの使用が、そこに新しい命令で定義された2次元配列であるためでしょうか?

精度、上記のコードは問題ではないようです(これを指摘してくれた人に感謝します)のでCustomClass、コンストラクターで( my の最大のオブジェクトによって)配列を開始する方法を次に示します。

tab = new int*[h];
for(int i=0; i<h; i++) {
    tab[i] = new int[v];
    for(int j=0; j<v; j++) {
        tab[i][j] = bitd(gen)*2-1; //initializing randomly the lattice
    }
}

bitd(gen)1またはを出力する乱数発生器0です。

また、私のCustomClassオブジェクトの別のメソッドは、次の方法で配列のサイズを 2 倍にします。

int ** temp = new int*[h];
for(int i=0; i<h; i++) {
    temp[i] = new int[v];
    for(int j=0; j<v; j++) {
        temp[i][j] = tab[i/2][j/2];
    }
}
delete[] tab;
tab = temp;

ポインターを解放する必要がある可能性はありますtempか?

4

1 に答える 1

4

あなたはメモリをリークしています。

ポインターの一時を解放する必要がある可能性はありますか?

tabいいえ。 double サイズの新しい配列にメモリを割り当てて内容をコピーした後、指しているメモリを解放する必要があります。現在、ポインターの配列のみを削除していますdelete [] tab;が、これらのポインターのそれぞれが指すメモリは失われています。ループを実行し、それぞれを削除します。そうして初めて行うtab = temp

さらに良いのは、メモリ管理を処理する標準のコンテナを使用して、生のポインタをいじることを忘れて、代わりに実際の作業に集中できるようにすることです。

于 2013-10-09T13:50:42.793 に答える