空き(ptr2)は自分のアレイを削除しますか?
ここでは、用語delete
は使用できません。 GNU manualは言う:あなたは、もはやあなたはmalloc関数となったブロックを必要としない場合には、再び割り当てられるブロックが利用できるようにして自由 機能を使用
。
ただし、関数の戻り値の型自体がvoid
であるため、freeは自動的にNULLにポインタを設定しません。また、
ブロックを解放するとブロックの内容が変更されます。 ブロックを解放した後にブロック内のデータ( ブロックのチェーン内の次のブロックへのポインタなど)を見つけることを期待しないでください。
私はそれを解放した後でポインタをNULLに設定する必要があるかどうかについて議論を喚起するつもりはありません。最初の例で
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* ptr1 = malloc(sizeof(int)*10);
int* ptr2 = ptr1;
free(ptr2);
if(ptr2!=NULL)
{
printf("ptr is %p\n",ptr2); // still printf
printf("Enter a number for ptr2 :");
scanf("%d",ptr2);
printf("Value pointed to by ptr2 : %d\n",*ptr2);
printf("Value pointed to by ptr1 : %d\n",*ptr1);
}
else
printf("Ptr2 pointed to null");
printf("Size of ptr1 : %d\n",sizeof(ptr1));
if(ptr1==NULL)
printf("ptr1 NULL\n");
printf("Enter a number for ptr1 :");
scanf("%d",ptr1);
printf("Value pointed to by ptr1 : %d\n",*ptr1);
printf("Value pointed to by ptr2 : %d\n",*ptr2);
free(ptr1);
if(ptr1==NULL)
printf("ptr1 freed\n");
return 0;
}
出力
ptr is 0x1c92010
Enter a number for ptr2 :4
Value pointed to by ptr2 : 4
Value pointed to by ptr1 : 4
Size of ptr1 : 8
Enter a number for ptr1 :1
Value pointed to by ptr1 : 1
Value pointed to by ptr2 : 1
*** glibc detected *** ./testp: double free or corruption (fasttop): 0x0000000001c92010 ***
Segmentation fault (core dumped)
、どちらか一方、両方ではない。しかし、私はクラッシュし、やけどこの例を投稿する誘惑を感じました。あなたが 'free'に与える唯一の情報は、ポインタの値です。第2の特有の工夫では、1つのメモリ空間しかシステムに戻されない。 –
'valgrind'というツールがあります。これはあなたが探して使い始めることをお勧めします。あなたのプログラム内のメモリリークを表示します(ある場合)。 –
'int ** ptr1 =(int **)malloc(sizeof(int)* 10);'でいくつかのポインタに必要なメモリを 'sizeof(int)* 10'を使って計算するコードはなぜですか? – chux