プレーンCで書いていますが、構造体へのポインターを解放する方法に問題があります。私は次のように宣言された構造を持っています
typedef struct _RealMatrix {
uint nRows;
uint nCols;
real **matrix;
} RealMatrix;
今、私はそれを必要とするたびにそれを割り当てるために次のコードを使用します
RealMatrix *realMatrixAlloc(uint n, uint m) {
loop_var(i);
RealMatrix *matrix;
matrix = malloc(sizeof(RealMatrix));
errcheck(matrix, "Unable to create real matrix structure.");
matrix->nRows = n;
matrix->nCols = m;
matrix->matrix = malloc(n*sizeof(real *));
matrix->matrix[0] = malloc(n*m*sizeof(real));
errcheck(matrix->matrix && matrix->matrix[0], "Unable to get requested memory for real matrix of dimensions: (%u, %u).", n, m);
f_i(i < n) matrix->matrix[i] = matrix->matrix[0] + i*m;
return matrix;
}
ここで、errcheck()は割り当てチェックマクロです。私がそれを呼び出して割り当てを解除しようとするまで、すべてがうまく機能します
freeRealMatrix(&myRealMatrix);
これは
free((*ma)->matrix[0]),
free((*ma)->matrix)
free(*ma).
*ma = NULL;
NULLポインターをたどらないように、適切なチェックを行います。ここで、「ma」は構造体へのポインタへのポインタです。関数宣言は次のようになります。
void freeRealMatrix(RealMatrix **ma);
ただし、この関数が返されると、「myRealMatrix」がまだ既存の構造をアドレス指定していることがわかります。これは、free(* ma)で期待したように割り当てが解除されていません。一方、配列(* ma)->matrixは正常に割り当て解除されています。
私が間違っていることについて何か考えはありますか?これは私を夢中にさせています...よろしくお願いします!
アップデート:
コードをコピーして、まったく新しいプログラムで実行しました...期待どおりに正確に動作します。「myRealMatrix」に含まれるアドレスが*maが指すアドレスと同じではないことに気づきました。ええと...ある種:切り捨てられたようです!0x106a50である代わりに、それは0x106aであり、それ以上ではありません。最後の2桁の16進数は毎回欠落しています!