这样超出作用域是否会释放相关内存?

4

我想知道,在以下情况下,'stringvar'使用的内存是否在method1执行完后被释放?

// 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个回答

24

不,内存在method1后没有被释放,因此会出现内存泄漏。是的,在使用完内存后您需要调用free

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

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

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

2
感谢您指出method2中相当严重的错误。 - emk
1
由于这是C语言,您不应该转换malloc的返回值。 - aib
如果我想将method2中的“str”作为数组来处理,那么我需要使用*str[x],对吗? - pbean
1
@pbean 是的。因为str是指向指针的指针,所以在使用之前必须先对其进行解引用。*str是一个指向char的单个指针,在这种情况下它恰好表示一个字符串。因此,是的,*str[x]将获取由*str指向的字符串的第x个字符。但是,在method2之外,您已经有了一个指向char的指针,因此说stringvar[x]就足够了。 - Andrew Keeton
1
@aib 我喜欢将malloc的结果强制转换的原因有两个:1)当处理双指针等时,将malloc的“返回类型”放在那里可以帮助我快速浏览它,2)如果我的指针出错了(比如我说str =而不是*str =),那么编译器会让我知道。我知道http://c-faq.com/malloc/mallocnocast.html,但我总是使用高警告进行编译,所以如果我没有包括`malloc`,我会注意到的。 - Andrew Keeton

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);
}

1
不要忘记调用free()函数。 - plinth
1
就算这样说可能没什么意义,但是按照标准,sizeof(char)保证为1,所以你不需要乘以它。我怀疑这并不重要,但我认为没有乘更清晰一些。 - Chris Lutz

2

在method1方法中,stringvar未初始化。而且,在method2中分配内存的方式是有问题的。你改变了method2中指针的副本,但这不会影响method1中指针的副本。为了使method1中的stringvar指向method2分配的内存,你需要使用双指针。



0
不需要,你需要自己调用free()。尝试使用char *stringvar = 0;来抑制警告。

0

你必须使用free()函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接