OS X 10.6で実行されているCコードをいくつか作成しましたが、これはたまたま遅いので、valgrindを使用してメモリリークなどをチェックしています。これを実行しているときに気付いたことが1つあります。
このように2D配列にメモリを割り当てると、次のようになります。
double** matrix = NULL;
allocate2D(matrix, 2, 2);
void allocate2D(double** matrix, int nrows, int ncols) {
matrix = (double**)malloc(nrows*sizeof(double*));
int i;
for(i=0;i<nrows;i++) {
matrix[i] = (double*)malloc(ncols*sizeof(double));
}
}
次に、行列のメモリアドレスが0x0であることを確認します。
しかし、私がそうするなら
double** matrix = allocate2D(2,2);
double** allocate2D(int nrows, int ncols) {
double** matrix = (double**)malloc(nrows*sizeof(double*));
int i;
for(i=0;i<nrows;i++) {
matrix[i] = (double*)malloc(ncols*sizeof(double));
}
return matrix;
}
これは正常に機能します。つまり、新しく作成されたメモリへのポインタが返されます。
メモリを解放するためのfree2D関数もある場合。正しく解放されていないようです。つまり、ポインタは、0x0(デフォルトの可能性があると思いました)ではなく、freeを呼び出す前と同じアドレスを指します。
void free2D(double** matrix, int nrows) {
int i;
for(i=0;i<nrows;i++) {
free(matrix[i]);
}
free(matrix);
}
私の質問は次のとおりです。malloc/freeがどのように機能するかを誤解していますか?そうでなければ、誰かが何が起こっているのかを提案できますか?
アレックス