在将其分配到本地函数之外后,C是否释放内存?

时间:2012-11-28 10:46:34

标签: c http malloc free

这是基本http服务器的代码片段

void sendFile(int socketNumber,char *filePath) {
    char *wwwFolder = "htdocs";
    int newFilePathSize = strlen("htdocs") + strlen(filePath) + 1;
    char *filePathFull = (char*) malloc(newFilePathSize); // allocating memory
    int i;
    for (i = 0; i < strlen(wwwFolder); i++)
        filePathFull[i] = wwwFolder[i];
    int j = 0;
    for ( ;i < newFilePathSize; i++)
    {
        filePathFull[i] = filePath[j++];
    }
    filePathFull[i] = '\0';

    //free(filePath); --
    /*filePath is a pointer with already allocated
    memory from previous function, however, if I try to free it
    in this function the program breaks down with this error:
    *** glibc detected *** ./HTTP: free(): invalid next size (fast): 0x09526008 *** */

    FILE *theFile = fopen(filePathFull,"r");
    printf("|"); printf(filePathFull); printf("| - FILEPATH\n");
    if (theFile == NULL)
    {
        send404(socketNumber);
        return;
    }
    else
        sendLegitFile(socketNumber,theFile,filePathFull);


    free(filePathFull); // freeing memory allocated in this
        //function seems to be okay
}

我想问一下,C会处理自己分配的内存吗?程序运行时它是否被释放?或者我无法释放在前一个函数中声明的filePath内存?

3 个答案:

答案 0 :(得分:2)

c中没有垃圾收集 如果您使用malloc分配内存,则应使用free取消分配。

如果您不这样做,则内存泄漏直到您的程序结束。 OS之后回收内存。

答案 1 :(得分:2)

在C中,您只能发布使用free(或malloccalloc)明确获得的realloc内存。并且free很挑剔,因为它需要接收malloc返回的完全相同的指针值。

如果以某种其他方式获取内存(例如,堆栈中的数组,或字符串文字,或......),将指向该内存的指针传递给free是一个错误


为避免出现问题,通常建议在同一函数或一对相关函数中保留内存的分配和释放,这样您就可以轻松验证传递给free的内存是否来自{{ 1}}(或其亲属)

答案 2 :(得分:0)

除了Als所说的,C中用于记忆管理的大规模接受的惯例是,malloc的“人”是负责free的人。由于你没有分配filePath,你不应该free它:负责人会这样做。如果你也这样做,它将导致双重免费(如果调用者在你返回后尝试使用filePath,则可能会遇到其他问题。)