1

malloc を使用してポインターを割り当て、ポインターが別の関数に渡され、それが最後に使用された別の関数に渡される関数があります。

私の質問は、その割り当てられたポインターの最終関数で free を呼び出すことができますか? または、malloc が呼び出される関数を呼び出す必要があります。

直面している問題は、この割り当てられたポインタの空きが日付までコーディングされていないため、メモリ リークが発生することです。したがって、私の仕事は今すぐメモリリークを修正することです。

4

3 に答える 3

1

いずれかを行うことはできますが、両方を行うことはできません。通常、メモリを割り当てたのと同じ関数内でメモリを解放するように設計することをお勧めします。

于 2013-11-04T06:43:05.200 に答える
0

その割り当てられたポインターの最終関数で free を呼び出すことができますが、それは良い習慣ではありません。割り当てられたメモリへのメイン ポインタを所有する関数内で free 関数を呼び出すことをお勧めします (これは、メモリを割り当てる関数ではない可能性があります)。次に例を示します。

void func() 
{
    void* ptr = malloc(...); // ptr variable declared and initialized here.
    func2(ptr);
    func3(ptr);
    func4(ptr);
    free(ptr); // Free memory in function where ptr is declared.
}

または、mallocfreeが高レベル関数にカプセル化されている場合:

void func() 
{
    void* ptr = allocateObject(...); // This function calls "malloc".
    func2(ptr);
    func3(ptr);
    func4(ptr);
    freeObject(ptr); // This function calls "free".
}

C関数は動的に割り当てられたメモリを解放しますが、変数値freeは変更しないことも考慮してください。ptrしたがって、メモリ リークが発生している場合は、 をNULL呼び出した後にポインタ変数を に設定することをお勧めしますfreeptr != NULLこの方法でコードをデバッグすると、メモリが割り当てられているか ( )、割り当てられていないか( ptr == NULL)がすぐにわかります。

if(ptr != NULL) 
{
    free(ptr);
    ptr = NULL;
}
于 2016-05-01T20:35:10.720 に答える