我只是想知道,在下面的方案中,在执行了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中是单元化的(这是真的)。
答案 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)
C FAQ list是一个非常有用的资源。具体来说,请参阅“When I call malloc to allocate memory for a pointer which is local to a function, do I have to explicitly free it?”。这方面的另一面是“I have a function that is supposed to return a string, but when it returns to its caller, the returned string is garbage.”
答案 4 :(得分:0)
不,你需要自己打电话给free()。尝试将char * stringvar = 0;压制警告。
答案 5 :(得分:0)
您必须使用free()