c-如何以及何时释放指针中的资源



我对释放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。

希望它能帮助。。。

最新更新