1

たとえば、ポインタが 1 つあるとします。

int *l1 = 新しい int[100*100];

int *l2 = l1;

現在、l1 と l2 はどちらも同じ整数のシーケンスを指しています。それらにいくつかの値を保存します。

言ってみましょう、私はそうします

[] l1を削除します。

l2も削除されますか?

を使用してl2の要素を印刷すると

for(int i=1; i<=10000; i++){

   cout<<l2[i]; 

}

それらの値は問題なく出力されますか?

4

4 に答える 4

20

i2 はまだ同じ場所を指していますが、そのメモリは解放されています。それを介して何かにアクセスしようとすると、未定義の動作になります。つまり、値が出力されたり、家が火事になったりする可能性があります。それはあなた次第ではありません。

分かりやすく言うと、i1 も i2 も削除されませんが、それらが指すメモリは削除されます。それらはまだ同じ値を保持していますが、そこにあるメモリは他のことに再利用できるようになりました。渡されたポインタを使用するのは安全ではdeleteありません。メモリには既に何か他のものが存在している可能性があるからです。

于 2013-10-22T16:06:40.727 に答える
5

理解に役立つ例え話があります。

ポインタはマンションの住所のようなものです。

多くの人が同じ建物の住所を持っているかもしれません。

そのうちの 1 人が配列を変更すると (建物を改築することを考えてください)、全員が同じものを見ているので、全員がそれを見ることになります。

アレイを「削除」すると、アパートの建物が廃棄済みであり、再開発が可能であるとマークされます。

多くの人は、現在非難されている建物が削除された後も、その住所を持ち続ける可能性があります。

配列が削除された後 (建物が非難された) に配列を参照する場合、配列がまだ存在する場合と存在しない場合があります。それは、市が非難された建物を取り壊すことに成功したかどうかにかかっています。安全ではありませんが、それを妨げるものは何もありません。運が良ければ、建物がまだそこにあることもあります。その場所に何か新しいものが建てられていることに気付くことがあります。時々建物があなたの上に倒れます。

于 2013-10-22T16:21:42.617 に答える
2
int *l1 = new int[100*100];

このステートメントで、100*100 の整数配列、つまり (10,000 *4 バイト) が作成されます。C int は 4 バイトです。 ここに画像の説明を入力

声明で、

int *l2 = l1;

ここに画像の説明を入力

delete [] l1;

ここに画像の説明を入力

于 2013-10-22T16:47:57.440 に答える