我已經寫了一些在OS X 10.6上運行的C代碼,這種情況發生的很慢,所以我使用valgrind來檢查內存泄漏等。我在執行此操作時注意到的一件事:在OS X上malloc的問題
如果我分配內存以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(我認爲這可能是默認值)。
void free2D(double** matrix, int nrows) {
int i;
for(i=0;i<nrows;i++) {
free(matrix[i]);
}
free(matrix);
}
我的問題是:我誤解了malloc/free的工作方式?否則有人可以建議發生了什麼?
亞歷
是的,你誤解了自由工作。 Free將'p'指向的存儲返回到「空閒列表」,但不會改變現在指向真實內存地址的「p」,但該內存不再屬於您的應用程序。什麼suihock說。 – msw 2010-10-16 10:17:23