试图在释放分配的内存时理解行为

时间:2014-08-25 07:15:42

标签: c pointers memory

我的代码功能如下:

void** array;
array = malloc(8*sizeof(void*));

如果我把三个元素放入数组并尝试:

int i = 0;
for(i; i < 8; i++)
   free(array[i]);

循环6次迭代后失败。但是如果我填充整个数组(有8个元素),for循环执行就好了。我已经尝试了18次,并且循环在9次迭代后失败,但是如果我填充整个事情它会执行得很好。

有人可以解释一下这里发生了什么吗?

2 个答案:

答案 0 :(得分:3)

malloc返回的内存未初始化;它可能包含垃圾数据。您正在分配指针数组,但其初始内容不是有效指针。您将某些项目设置为(可能是)有效指针,但其他人未初始化,然后在所有项目上调用free - 甚至是未初始化的垃圾。

您需要:

  • 跟踪数组中的哪些项目已设置为有效指针,并仅对这些项目调用free,或
  • 将所有项目显式初始化为NULL。这使free所有人都安全,因为free(NULL)有效(并且什么都不做)。

答案 1 :(得分:0)

指针指向指针的内存分配并分配给指针,以便为内部指针分配更多内存来保存实际数据,即{{1} }被分配了int**的内存,以便int*可以分配给分配的int

int*

然后你要这样做以释放内存

// array is a double pointer variable
void **array = malloc(8 * sizeof *array);  // (1) allocate memory for 8 void* pointers
for (int i = 0; i < 8; ++i)
   array[i] = malloc(sizeof(int));
   // (2) - malloc for the actual data to be pointed by the above allocated pointers

您必须将每个for (int i = 0; i < 8; ++i) free(array[i]); // undo (2) free(array); // undo (1) malloc相匹配。由于您只完成了1,因此您只应撤消1。