free
動的に割り当てられたメモリへのポインターに対する後続の呼び出しが害を及ぼさないことを確認したい場合はNULL
、そのポインターに割り当てる必要があります。理由(強調を追加):
free() 関数は、ptr が指すメモリー空間を解放します。このメモリー空間は、malloc()、calloc()、または realloc() への以前の呼び出しによって返されたものでなければなりません。それ以外の場合、または free(ptr) が以前に呼び出された場合、未定義の動作が発生します。ptr が NULL の場合、何も実行されません。
b
ポインターが常に他のポインターが指している同じオブジェクトを参照するようにしたい場合は、代わりにポインターにa
変えることができます(使用する必要があるたびに逆参照します)。b
a
#include <stdio.h>
#include <stdlib.h>
int main() {
/* dynamically allocate some memory */
int *a = malloc(40);
/* b is a pointer to a pointer to an int */
int **b;
/* make b point to a */
b = &a;
if ( 1 ) {
/* free memory and assign NULL to the pointer */
free(a);
a = NULL;
}
/* nothing bad will happen when we dereference b now */
printf("%p\n", *b);
/* nothing bad will happen when we free the memory region
where the pointer b points to points to */
free(*b);
}
メモリリークに関する別のこと。メモリを二重に解放しても、メモリ リークは発生しません。その場合、未定義の動作に遭遇し、その場合、何かが起こる可能性があります. 自分のものではないメモリ領域にアクセスしてはならないという理由だけで(もう)(cf、この素晴らしい投稿を参照)。代わりに、動的に割り当てられたメモリのブロックへの参照を失うと、メモリ リークが発生します。例えば:
/* allocate some memory */
int *a = malloc(40);
/* reassign a without free-ing the memory before : you now have leaked memory */
a = malloc(40);