2016-04-02 24 views
1

我对C程序中释放内存有疑问。 我不知道内存如何被释放。以下是两种情况,我不确定我是否需要释放内存。下面如何以及何时释放指针中的资源

是代码片段

int status=0; 
char *grade="high"; 
status=getPreviousReports(grade, year); 
free(grade); 

我的疑问是,getPreviousReports是做一个SOAP调用和及格吧。之后,它破坏了内存中的肥皂对象,它在形成肥皂对象时使用了等级。

如果我使用下面的代码,那么我是否需要不显式释放等级?

status= getPreviousReports("high", year); 

请帮助我了解如何以及何时需要释放内存。

在此先感谢。

+0

你只需要释放你分配的东西。等级变量只是一个指向常量字符串的指针。对于大多数实现,等级变量可能分配在堆栈中。当你从功能返回时它将“释放”。 “高”常量永久分配在某个恒定的内存块中,不能释放。 – lit

回答

2

如果您(或其他人)使用malloc和家人分配了内存,那么您free吧,否则不行。返回由malloc分配的内存的函数通常应该记录调用者知道的内存。

你的具体情况

char *grade="high" 

没有动态内存分配的参与,所以没有必要free

我的疑问是,getPreviousReports正在做一个肥皂调用并将 等级传递给它。之后它破坏内存中的肥皂对象, 在形成肥皂对象时使用等级。

你需要什么功能,在内部做更多的信息,以及是否手动释放它的一些参数,e.g grade,这将是不可思议。

0

既然你不分配(malloc,calloc)任何内存,你不需要释放它。我不知道getPreviousReports()究竟在做什么。但通常如果某个函数分配内存,则需要注意释放(但不是传递的变量)。

此外,我会建议你使用调试器和getPreviousReports()调用后检查*级。

希望它可以帮助...用C

+0

谢谢,澄清疑问。基于这些输入,我可以在一定程度上优化我的代码,方法是尽早将常用变量声明为const char *而不是声明内部方法。再次感谢 。 – summary

+0

np,BTW const char *方法在C中很常见... –

+0

c中变量的作用域是什么?事情是我的程序运行24小时,并在一天内重新启动一次。我调用调用getPreviousReports()的方法X(),并且X()每5分钟重复调用一次。由于im在x()中声明了char * grade ='high',而不是在程序中声明它,它会在x()返回时从内存中清除掉吗? – summary

4

内存分配由malloc的使用,如果内存不被使用(malloc的)再没有什么需要自由。

0

正如其他人已经注意到的,在C中,如果[c][m][re]alloc()尚未用于创建内存,则通常不需要free()。 (也参见strdup也需要使用free()

在更一般意义上,在C中的所有存储器被说成驻留在任一heap or the stack。您创建的所有内存都清楚地创建在堆栈上,并且不需要明确释放。以这种方式创建的内存在超出范围时或在可执行文件退出时被释放。在(然后释放)和堆栈(不释放)中创建的存储器

实例包括:

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

“你好” 是一个字符串文字。因此,它会在那里的记忆,即使你GRADE变量超出范围或更改它指向别处,或者你宣布你的GRADE变量甚至在它存在。

自由函数与您在运行时使用malloc()请求的内存块一起使用,即动态内存分配。

在运行时你没有要求为你的“Hello”字符串分配空间,这就是为什么你不应该在它上面调用free。