【发布时间】:2011-04-26 07:01:49
【问题描述】:
我已经编写了一些在 OS X 10.6 上运行的 C 代码,它恰好很慢,所以我使用 valgrind 来检查内存泄漏等。我在执行此操作时注意到的一件事:
如果我将内存分配给这样的二维数组:
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函数来释放内存时。它似乎没有正确释放。 IE。指针仍然指向与调用 free 之前相同的地址,而不是 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 所说的。
标签: c macos memory-management pass-by-value