使用malloc和free包装器

时间:2011-02-04 20:05:23

标签: c malloc free

有人可以建议如何释放除main之外的函数内部分配的内存(例如:以下示例中的mymalloc())?在程序中从不同的函数调用是否有效?或者,既然我们在myalloc()中分配了内存,我们是否需要在myalloc()内部释放它? 请建议是否有更好的方法来实施以下内容。


int main(int argc, char ** argv) {
  int * arr = {0};

  foo();
  return 1;
}

void mymalloc(int ** myarr1 ) {
  (*myarr1) = (int*) malloc( sizeof(int)*25 );
  (*myarr1)[3] = 69;
}

void myfree(int ** myarr2 ) {
   if (*myarr2) {
    memset(*myarr2, 0, sizeof(int)*25 );
    free(*myarr2);
}

void foo() {
  int * arr1 = {0};

  mymalloc(&arr1);
  printf("car[3]=%d\n",arr1[3]);
  myfree (&arr1);

  // Check if memory was freed
  if (arr1) {
  printf("ERROR: Memory allocated to arr1 is not freed.");
  exit (1);
  }
}

输出:
错误:未释放分配给arr1的内存。

3 个答案:

答案 0 :(得分:2)

您可以free在程序的任何位置使用malloc创建的任何内容。

使用malloc分配的内存来自内存的“堆”部分,除非与free一起发布,否则将在程序的整个生命周期内保留。

答案 1 :(得分:1)

没有必要在同一个函数中调用malloc和free,但我对你的代码有一些评论:

  1. 为什么要使用单独的功能?
  2. myfree中的memset无用,无论如何指针都无效。
  3. 将{0}分配给指针是没用的,因为无论如何malloc都会覆盖它们。

答案 2 :(得分:0)

你的内存被正确释放,但是一个空闲的调用没有将指针设置为null,指针仍指向现在无效的地址。如果你在免费后尝试写一些东西到arr1,你会得到一个分段错误,即使arr1没有指向null。

这就是为什么你应该在释放它之后总是将指针设置为null