私は、メモリをほとんど最適化する必要がない大きな数値解析プログラムを作成しています。
私のプログラムでは、行列を計算して、それをいくつかの関数で使用する必要があるポイントがいくつかあります。行列を呼びましょうf
。f
はwinSize x winSize
、f
作成前に計算される変数です。
私にはいくつかの機能がありますが、これは重要な機能です。
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メモリがないため、数回の反復でプログラムがクラッシュします...これはメモリが解放されていないことを示している可能性があります。次に、関数の外側にメモリを作成してから、関数の外側を削除しようとしました。このようにして、メモリが割り当てられ、削除されていることがわかります。しかし、関数内に入ると、割り当ては表示されますが、割り当て解除は表示されません。