1

だから私はポインタを学んでいて、ここでメモリリークを特定するのに苦労しています。私はこれまでmalloc()を使用したことがなく、ポインター演算に慣れていないことを告白します。前もって感謝します。

 /*filename: p3.c */
#include <stdio.h>
#include <stdlib.h>

int main()
{
        char *buffer;
        char *p;
        int n;

        /* allocate 10 bytes */
        buffer = (char *) malloc(10);

        p = buffer;
        for (n=0; n<=10; n++)
                *p++ = '*';

        p = buffer;
        for (n=0; n <=10; n++)
                printf("%c ", *p++);

        return 0;
}
4

4 に答える 4

3

ルールはかなり単純です。すべてのmallocには無料が必要です。フリーよりも多くのmallocがある場合は、メモリの割り当てを解除するのを忘れたため、メモリリークが発生します。mallocよりも多くの空きがある場合は、すでに割り当てが解除されているメモリの割り当てを解除しようとしていますが、それは必要なことではありません。

于 2012-09-23T01:37:40.823 に答える
2

バッファが不要になったときに、関数を使用してバッファを解放する必要があります。free()

    /* ... */
    free( buffer );
    return 0;
}

メモリが使用されなくなったときに、への各呼び出しとへの呼び出しのバランスをとることを忘れないでください。mallocfree

変数の操作は影響しpませんbufferこれらは(開始時に)同じ領域を指す2つのポインターですが、それでも2つの異なる変数です。したがって、インクリメントしてもインクリメントpされませんbuffer。したがって、質問のコメントでDaniel Fisherが述べているように、範囲外で書き込んでいるという事実を除いて、
のポインタ操作に問題はありません。p

また、失敗する可能性があるため、呼び出し後に常にチェックNULLする必要があることにも注意してください。最近では非常にまれですが、失敗した場合は、ポインタを逆参照するため、プログラムがクラッシュする可能性があります。mallocmallocNULL

buffer = malloc( 10 );

if( buffer == NULL )
{
    /* Error management - Do not use buffer */
}

C ++を扱っている場合を除き、へのキャストchar *は必要ありません。Cでは、を別のポインタタイプmallocに割り当てることが有効です。void pointer

于 2012-09-23T01:37:28.410 に答える
2

あなたは電話mallocし、決して電話しませんfree。もちろん漏れます。

alloc原則として、機能ファミリーに要求するすべての割り当てはfree、それらを使い終わったらすぐに編集する必要があります。

プログラムが終了するまで使用し続けるバッファは、正式にはリークですが、明確に定義された数のバッファを割り当てている限り、問題はありません。これには、ここで行っていることも含まれます。

于 2012-09-23T01:38:02.483 に答える
2

必要なn<=10ではありませんが、n<10です。

于 2012-09-23T01:38:15.273 に答える