通常、ポインタが2回解放されると、2回解放されます。例えば、
char *ptr;
ptr=malloc(5 * sizeof(*ptr));
free(ptr);
free(ptr);
上記のコードはダブルフリーと見なされます。以下もダブルフリーと見なされますか?
char *ptr;
char *ptr1;
ptr=malloc(5 * sizeof(*ptr));
ptr1=ptr;
free(ptr);
free(ptr1);
ありがとうございました。
はい。同じメモリを2回解放しています。
はい。ライブラリは、ソースコードで変数にどのような名前を付けたかを気にしません(コードが実行されるまでに長い間使用されていません)。重要なのは値だけであり、この場合、渡される値free()
は同じになります。
はい。ポインタは両方とも同じアドレスを指しているため、同じアドレスを解放に渡します。
あなたはそれを印刷することによってポインタの値が何であるかを示すことができます
printf( "%p", ptr);
またはデバッガーでそれを見てください
うん。ダブルフリーとは、すでに解放されているメモリブロックを解放しようとする場合です。ptrとptr1の両方が同じメモリブロックを指しているため、への2番目の呼び出しfree
は、すでに解放されているメモリブロックを解放しようとしています。
はい、これはダブルフリーです(そして非常に悪いことです)。ptr1は、mallocによって割り当てられたメモリへのポインタです。これは、ptrが指していたのと同じ場所です。ptrとptr1を解放すると、同じメモリが2回解放されます。