2

私は、メモリをほとんど最適化する必要がない大きな数値解析プログラムを作成しています。

私のプログラムでは、行列を計算して、それをいくつかの関数で使用する必要があるポイントがいくつかあります。行列を呼びましょうffwinSize x winSizef作成前に計算される変数です。

私にはいくつかの機能がありますが、これは重要な機能です。

double** getF(some params to get f,int winSize){
    double** f=new double*[winSize];
    for(int i=0;i<winSize;i++)
         f[i]=new double[winSize];
    /* 

    Some stuff to fill f

    */
}
void freeF(double** f,int winSize){
     for(int i=0;i<winSize;i++)
         delete [] f[i];
     delete [] f;
}

そして、プログラムは次のようになります。

int winSize=computeWindowSize();
double** f=getF(someparams,winSize);

hiIamaFunctionThatWantsToReadF(params...,f,winSize);
soIwant(params2...,f,winSize);
iamJustCurious(f,winSize);

freeF(f,winSize)

誰もfを変更せず、読むだけであることに注意してください。

私の問題は、これがメモリを解放しないことです。問題はfの扱い方にあると思いますが、よくわかりません。

私の質問は次のとおりです。

  • なぜこれが機能しないのですか?
  • それを機能させるにはどうすればよいですか?

編集:

メモリが解放されていないことを確認するにはどうすればよいですか?

このコードを1000x1400回実行する必要がありますが、コンピューターに空きRAMメモリがないため、数回の反復でプログラムがクラッシュします...これはメモリが解放されていないことを示している可能性があります。次に、関数の外側にメモリを作成してから、関数の外側を削除しようとしました。このようにして、メモリが割り当てられ、削除されていることがわかります。しかし、関数内に入ると、割り当ては表示されますが、割り当て解除は表示されません。

4

1 に答える 1

5

コードが機能しないことを伝えるには情報が少なすぎるようです。

多分それは示されていないコードにあります。

ただし、動作が保証されている構成を使用できます。

それ以外の

double** f=getF(someparams,winSize);

行う

std::vector<double> f( winSize*winSize );

その後、代わりに

f[y][x]

行う

f[y*winSize + x]

もちろん、そのインデックス作成を行う関数を定義できます

もちろん、行列クラスでラップすることもできます

しかし本質的に、それは物事を機能させるための1つの方法です:)

割り当てと割り当て解除の両方が処理されることに注意してstd::vectorください。必要に応じて、サイズを変更したりコピーしたりすることもできます。

于 2013-02-21T08:51:20.033 に答える