-2

重複の可能性:
ポインターを解放した後にポインターを逆参照すると、異なる結果が得られるのはなぜですか?

文字の場合も試してみましたが、8つの値の後、最初の8つがガベージ値を示していて、最初の2つの値がガベージを示していて、3つ目はそのままで、9番目の値が正しいことを確認しました。したがって、最初の8バイトだけが割り当て解除されます。なんでそうなの?チェックする配列内のインデックスの数を増やすこともできます。誰かがFREE()メソッドがここでどのように機能しているかを説明してください。

#include<iostream>
using namespace std;
#include<conio.h>
int main()
{
int *arr;
arr=(int *)malloc(sizeof(int)*3);
arr[0]=10;
arr[1]=20;
arr[2]=30;

free(arr);
for(register int i=0;i<3;i++)
{
cout<<arr[i]<<endl;
}
getch();
return 0;
}
4

3 に答える 3

0

arrを解放した後、その値を使用しています。これは無効であり、結果は定義されていません。この場合、freeの実装では、最初の8バイトをレコードの保持(フリーリストポインターやバディの長さなど)に使用していると思います。

于 2013-01-16T20:39:04.770 に答える
0

free()基本的には、ランタイムシステムに「このメモリは使い終わったので、都合の良いときに他のことに自由に再利用してください」とだけ伝えます。言い換えると、後でメモリを読み取ることfree()は完全にサポートされておらず、書き込んだ内容を正確に読み戻すことからプログラムをクラッシュさせることまで、あらゆる価値をもたらす可能性があります。

于 2013-01-16T20:39:06.167 に答える
0

free()の呼び出しは、メモリが将来の割り当てで再利用できることをメモリアロケータに通知します。以前に受け取ったポインタを魔法のように無効にすることはありません。そのポインタはまだ...どこかを指しています。システムで他に何が起こっているかに応じて、元の値が指定されたメモリ位置に残っている可能性があります。

もしも

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

に設定arrすると0xabcdabcd(メモリ内のアドレスを表します)、arrを呼び出した後もその正確な値に設定されますfree。そのアドレスにはまだ何かがあります。その何かがあなたがそこに置いた価値であるかもしれないし、そうでないかもしれない。

于 2013-01-16T20:39:53.380 に答える