0

这是基本 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 内存是我的错?

4

3 回答 3

2

在 C 中,您只能释放使用(或或)free显式获得的内存。并且很挑剔,因为它不需要接收与返回的完全相同的指针值。malloccallocreallocfreemalloc

如果内存是通过其他方式获得的(例如堆栈上的数组,或字符串文字,或...),则将指向该内存的指针传递给free.


为避免出现问题,一般建议将内存的分配和释放保持在同一个函数或一对相关函数中,这样您就可以轻松验证传递给的内存free是从malloc(或其亲属)获得的

于 2012-11-28T10:51:25.450 回答
2

c中没有垃圾收集。
如果你使用分配内存,malloc你应该使用free.

如果你不这样做,内存就会泄漏,直到你的程序结束。之后操作系统回收内存。

于 2012-11-28T10:49:37.240 回答
0

除了 Als 所说的,在 C 语言中被广泛接受的内存管理约定是,执行该操作的“人”malloc是负责free. 因为你没有分配filePath你不应该free它:负责人会做。如果您也这样做,它将导致双重释放(如果调用者filePath在您返回后尝试使用,可能还会出现其他问题)。

于 2012-11-28T12:45:59.917 回答