0

次のコードがあります。

void fn(char *string , int flag)
{
    static char* array_of_strings[100];
    static int index = 0;

    if(flag)
    {
        array_of_strings[index] = (char *)malloc(10);
        strcpy(array_of_strings[index] , string);
        index++;
    }
    else
    {
        //How should I deallocate the memory here?
        index--;
    }
}

else ブロックが満たされた場合、array_of_strings[index] はどうなりますか? 自動的に割り当て解除されますか、それとも fn() が戻った後も残りますか? コメントの代わりにこの行を使用する必要があります:

array_of_strings[index] = 0;

または、次のように free() を使用できますか:

free(array_of_strings[index]);

これにより、malloc によって割り当てられたメモリ ブロックが解放されますか?

4

2 に答える 2

3

これで問題ありません:

/* Allocate an array to hold 100 char * pointers: OK */
static char* array_of_strings[100];

/* Allocate space to hold one 9-character string: OK */
array_of_strings[index] = malloc(10);

/* Free string: OK */
free(array_of_strings[index]);

これはあなたを悲しませます:

/* Whoops: step on the pointer, then try to free it.  Not good :( */
array_of_strings[index] = 0;
free(array_of_strings[index]);

Q: else ブロックが満たされた場合、array_of_strings[index] はどうなりますか? 自動的に割り当て解除されますか、それとも fn() が戻った後も残りますか?

A: 何かを malloc すると、「free()」するまで、またはプログラムが終了するまで、割り当てられたままになります。

于 2013-10-07T23:10:57.350 に答える
3

呼び出し

free(array_of_strings[index]);

の静的配列の割り当てを解除するのではなく、動的に割り当てられchar*た 10 秒間予約されたメモリ ブロックと、ポインターの配列にchar格納されているポインターの割り当てを解除します。staticこれは、メモリ リークを回避するために行うべき正しいことです。

一方、この行では、動的に割り当てられたメモリ ブロックにアクセスできなくなります。

array_of_strings[index] = 0;

この状況は、一般に「メモリ リーク」として知られています。避けるべきです。

free次のように、誤って逆参照しないように d ポインターをゼロに設定することは珍しくありません。

free(array_of_strings[index]);
array_of_strings[index] = 0; // Prevent a "dangling reference"

このようにすると、 のポインターarray_of_strings[index]が後で有効でなくなることがわかります。

于 2013-10-07T23:12:02.643 に答える