我对释放C程序中的内存有疑问。我不知道记忆是如何被释放的。下面是两种情况,我不确定是否需要释放内存。
下面是的代码片段
int status=0;
char *grade="high";
status=getPreviousReports(grade, year);
free(grade);
我怀疑getPreviousReports是在做一个soap调用并将grade传递给它。之后,它破坏了内存中的soap对象,该对象在形成soap对象时使用了grade。
如果我使用下面的代码,那么我不需要明确地释放分数吗?
status= getPreviousReports("high", year);
请帮助我理解如何以及何时需要释放内存。
提前谢谢。
C中的内存分配由malloc使用,如果内存没有被使用(malloc),那么就不需要空闲。
如果您(或其他人)使用malloc
和族分配内存,则您free
分配内存,否则不分配。返回由malloc
分配的内存的函数通常应该记录该内存,以便调用方知道。
在您的特定情况下
char *grade="high"
不涉及动态存储器分配,因此不需要free
。
我怀疑getPreviousReports是在做一个soap调用并传递给它打分。之后,它会破坏内存中的soap对象在形成肥皂对象时使用等级。
您需要更多关于该函数在内部做什么的信息,以及它是否手动释放一些参数,例如grade
,这会很奇怪。
"Hello"是一个字符串文字。因此,即使您的GRADE变量超出范围,或者您将其更改为指向其他地方,或者它甚至在您声明GRADE之前就存在,它也会在内存中。
free函数用于您在运行时使用malloc()请求的内存块,即动态内存分配。
您没有请求在运行时为"Hello"字符串分配空间,这就是为什么您不应该对其调用free的原因。
正如其他人所指出的,在C中,如果[c][m][re]alloc()
没有用于创建内存,那么free()
通常是不必要的。(另请参阅也需要使用free()
的strdup)
从更普遍的意义上讲,C中的所有内存都位于堆或堆栈上。您创建的所有内存都是在堆栈上创建的,不需要显式释放。以这种方式创建的内存在超出范围或可执行文件退出时会被释放。
在堆(然后释放)和堆栈上创建的内存示例包括:
int main()
{
int status=0;//created on the stack
char *grade="high";//created on the stack
char *buf = {0};//created here, but no memory yet
char *temp = {0};//ditto
char *dup = {0};//ditto
//....
buf = malloc(10);//on heap if successful. free() now required at some point
if(buf)
{
strcpy(buf, "started..");
temp = realloc(buf, 20);//on heap if successful
if(!temp)
{
free(buf);
return -1;
}
buf = temp;//new memory transferred to buf, free() now required at some point
strcat(buf, "here");
dup = strdup(buf);//on heap if successful, free() now required at some point
if(!dup)
{
free(buf);//memory alloc failed, handle error and leave
return -1;
}
//use buf and dup...
free(buf);
free(dup);
//Note: temp is freed when buf is freed in this example
}
return 0;
}
因为你不分配(malloc,calloc)任何内存,所以你不需要释放它。我不知道getPreviousReports()
到底在做什么。但通常,如果某个函数分配内存,它会注意释放(但不会释放传递的变量)。
此外,我建议您在getPreviousReports()
调用后使用调试器并检查*grade。
希望它能帮助。。。