超出这样的范围会释放相关的记忆吗?

时间:2009-08-24 14:55:28

标签: c memory malloc

我只是想知道,在下面的方案中,在执行了method1之后释放的'stringvar'使用的内存是什么?

// Just some method
void method2(char* str)
{
  // Allocate 10 characters for str
  str = malloc(10 * sizeof(char));
}

// Just another method
void method1()
{
  char* stringvar;
  method2(stringvar);

  // Is the memory freed hereafter, or do I need to call free()?
}

我问,因为如果我在method1的末尾加上'free(stringvar)',我会得到一个警告,即stringvar在method1中是单元化的(这是真的)。​​

6 个答案:

答案 0 :(得分:22)

不,在method1之后内存解除分配,因此您将发生内存泄漏。是的,您需要在使用完内存后调用free

如果您希望它分配内存,则需要将 指针发送到指针 method2。这是C编程中常见的习惯用法,特别是当函数的返回值保留为整数状态代码时。例如,

void method2(char **str) {
    *str = (char *)malloc(10);
}

char *stringvar;
method2(&stringvar);
free(stringvar);

答案 1 :(得分:5)

不,动态分配的内存不会自动为您释放。在C中,程序员有责任自由。

另外 - C按值传递变量,str = malloc(10 * sizeof(char));只是分配给本地'str'变量。

好像你想要返回从malloc获得的指针,所以你的程序变成了:

char *method2(void)
{
  // Allocate 10 characters for str
  return malloc(10 * sizeof(char));
}

// Just another method
void method1()
{
  char* stringvar;
  stringvar = method2();
  ...
  free(stringvar);
}

另一个选项,如果你想从method2中操纵'stringvar',就是把一个指针传递给'stringvar',例如。

void method2(char** str)
{
  // Allocate 10 characters for str
  *str = malloc(10 * sizeof(char));
}

// Just another method
void method1()
{
  char* stringvar;
  method2(&stringvar);
  ...
  free(stringvar);
}

答案 2 :(得分:2)

在method1中不仅没有初始化stringvar,而且在方法2中为你的内存分配内存是错误的。您在method2中更改指针的副本,但这不会影响method1中指针的副本。您需要使用双指针,以使method1中的stringvar指向method2分配的内存。

答案 3 :(得分:2)

答案 4 :(得分:0)

不,你需要自己打电话给free()。尝试将char * stringvar = 0;压制警告。

答案 5 :(得分:0)

您必须使用free()