2

free は以下のメモリを解放しますか? また、メモリが解放されたことを確認するにはどうすればよいですか?

int *p = malloc(sizeof(int));
int *q = p;
free(q);

動的に割り当てられたメモリの MCB 構造にアクセスする方法は?

4

3 に答える 3

2

free() の定義::

void free (void* ptr);

メモリ ブロックの割り当てを解除する

malloc、calloc、または realloc の呼び出しによって以前に割り当てられたメモリ ブロックは、割り当てが解除され、その後の割り当てに再び使用できるようになります。

上記の関数で割り当てられたメモリのブロックを ptr が指していない場合、未定義の動作が発生します。

ptr が null ポインターの場合、関数は何もしません。

この関数は ptr 自体の値を変更しないため、同じ (現在は無効な) 場所を指していることに注意してください。

したがって、その場合、同じ場所を指しているポインタを介して解放されたメモリにアクセスしようとすると、「未定義の動作」が発生します。この未定義の動作を呼び出すことで同じことを確認できます (実験目的のみ)。または、Valgrind を使用して確認できます。Visual Studio を使用している場合は、ポインタにウォッチを追加しqて、メモリ レイアウトとブロックの解放を自分で確認できます。

于 2013-09-19T05:20:22.667 に答える