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 にはガベージ コレクションはありません。
を使用してメモリを割り当てた場合は、を使用しmallocて割り当てを解除する必要がありますfree

そうしないと、プログラムが終了するまでメモリリークが発生します。その後、OSはメモリを再利用します。

于 2012-11-28T10:49:37.240 に答える
2

C では、 (またはまたは)freeで明示的に取得されたメモリのみを解放できます。そして、によって返されたのとまったく同じポインター値を受け取る必要がないという点で厄介です。malloccallocreallocfreemalloc

メモリが他の方法で取得された場合 (たとえば、スタック上の配列、文字列リテラルなど)、そのメモリへのポインタを に渡すのはバグfreeです。


問題を回避するために、メモリの割り当てと解放を同じ関数または関連する関数のペアで保持することをお勧めします。これにより、渡されたメモリが(またはその親族)freeから取得されたことを簡単に確認できます。malloc

于 2012-11-28T10:51:25.450 に答える
0

Als が言ったことに加えて、C で広く受け入れられているメモリ管理の規則は、 を実行した「人」がmallocを担当するというものfreeです。あなたが割り当てていないので、割り当てるfilePathべきではありませんfree。責任者が割り当てます。あなたもそうすると、ダブルフリーになります(そして、filePathあなたが戻った後に呼び出し元が使用しようとすると、おそらく他の問題が発生します)。

于 2012-11-28T12:45:59.917 に答える