2016-03-29 11 views
0

私は、削除されたポインタが指し示すメモリがゼロで覆われるべきであると思いました(わからない) それでもint値10と同じアドレスを指しています。どうしたの?削除されたポインタがまだ古いデータを指している

int *p = new int; 
*p = 10; 
cout << *p << endl; //10 
cout << p << endl; //0x7fafc3c02e80  
delete p; 
cout << *p << endl; //10 
cout << &(*p) << endl; //0x7fafc3c02e80! 
return 0; 
+3

ポインタを削除しても、指していたアドレスは変更されません。一度割り当てられたメモリを解放するだけで、再度使用することができます。また、削除されたポインタの逆参照は未定義の動作です。 – xinaiz

+1

クレジットカード番号は紙に書きます。あなたはそれを粉砕してごみ箱に投げます。他の人がそれを取り出し、紙を解き放ち、あなたのクレジットカード番号を読みます。どうしたの? (部分的にC++の場合で起こっても、任意のしわは通常、完璧なアナロジーがありませんないので。) –

+1

ポインタ手段を削除する(HTTP [ 'メモリはダイナミックmemory.'の他の要求のために再び使用可能になった]:// WWW。 cplusplus.com/doc/tutorial/dynamic/)。 – tchelidze

答えて

2

削除演算子は、ポインタが指すメモリを解放します。一度解放すれば、いつでも再割り当てすることができ、そのポインタにアクセスすると予測できない結果になります。あなたのプログラムでは、メモリがまだ他のもののために再割り当てされていない場合があります。

具体

https://msdn.microsoft.com/en-us/library/h6227113.aspx

:オブジェクト上のdelete演算子を使用

」は、そのメモリを解放するオブジェクトが削除された後、ポインタを参照解除プログラムが予期しない結果またはクラッシュを有することができる 削除が使用されます。 C++クラスオブジェクトのメモリを解放するために、オブジェクトのデストラクタはオブジェクトのメモリが解放される前に呼び出されます(オブジェクトにデストラクタがある場合)。

1

無料のヒーププールに割り当てられた領域が返されました。それは何かがそれにゼロを書くことを意味しません。それには時間がかかり、その時間をその仕事に費やしたくないかもしれません。

破壊中にストレージをクリアできるデストラクタがいくつかあると思われますが、intはありません。

あなたはそれはあなたがそれで行われ、システムを言った後にメモリを使用し続けることも、悪い考えですdelete

を呼び出す前に自分でそれをクリア、データが消去たい場合。

deleteの後にポインタをNULLに設定するオプションがあります。これにより、ねじを締めて古いポインタを使用しようとすると例外が発生します。

0

ポインタの実際のvalueまたはそのポインティング値を削除していません。 はメモリの割り当てを解除しているので、「後で」別のポインタが同じ場所を指すようになります。

+0

厳密に言えば、ポインタは同じ場所を指す必要はありません。解放されたメモリは、後続の割り当ての途中で使用することもできます。 – Downvoter

+0

@cad 100%正しい。しかし、このようなnoobの質問のためではありません –

+0

noobの質問は簡素化を必要とするので、より不正確で抽象的な説明が良いでしょう。平凡な不正解は、特にノブにとって有害で​​す。 – Downvoter

関連する問題