12

次のようなポインターを宣言するときに free() を使用する必要があるのはなぜですか。

int *temp = (int*)malloc(sizeof(int))
*temp = 3;

しかし、私がするときではありません:

int temp = 3;
4

8 に答える 8

30

通常の宣言はスタックに置かれます。関数が戻ると、スタック ポインターは関数が呼び出される前の値に戻るため、メモリは自動的に再利用されます。

Malloc ベースの宣言は「ヒープ」から割り当てられるため、プログラマは割り当てと割り当て解除を管理する必要があります。

于 2009-03-09T17:25:24.893 に答える
2

必要性は、ポインタを宣言したかどうかに依存するのではなく、メモリを edfree()したかどうかに依存します。malloc()

Brian Bondy が前に言ったように、変数 (" int number"、" char string[10]"、" float your_boat" など) は、コードが関数ブロックを離れるときのように、スコープから外れると消えます。したがって、質問のポインター (" temp") は、呼び出しても消えませんfree()。むしろ、呼び出し時に割り当てられたコードはすべてmalloc()消えます。ポインタはまだそこにとどまります。つまり、サンプル コードの直後に、temp = &some_other_variable(再び) " int *temp;" と言わなくても " " と言うことができます。

誰かが関数を実装したことがあり、その関数がたまたま を呼び出しmalloc()、それがプログラムのメモリを要求し、そのデータを解放する必要がなかった場合、次のように言うことができます。

int * temp = (int*)malloc(sizeof(int));

後で言わずに

free(temp);

しかし、それmalloc()は実装されている方法ではありません。

于 2009-03-09T17:49:12.310 に答える