2011-01-27 20 views
0

私はC++を学ぶ過程にあり、delete演算子の新機能です。コードからわかるように、私はdelete演算子を新しい演算子(m)に適用しています。私はまだポインタを使用してそれを新しい値に割り当てることができますが、それを適用した後。私はコンパイラエラーを受けていません。私が読んだところでは、ポインタが何かを指していないので、削除を適用した後に新しいポインタを使用するべきではありません。どんな助けも歓迎です。ありがとうございました。それをdelete'ingした後、ポインタを使用してコンソール出力リレーC++ - 演算子の混乱の混乱

14 12 
+2

C++の美しい世界へようこそ。 ; - > –

+0

ポインタを削除した後にポインタをNULLに手動で設定するのが一般的には良い考えです(tm)。 –

+4

誰かがC++で何かできないと言っても、それは必ずしもコンパイラがあなたにそれをさせないということを意味するわけではありません。 「定義されていない動作」(http://en.wikipedia)という結果になる「エラー」というカテゴリがあります。org/wiki/Undefined_behavior "未定義の動作") - これはコンパイラがあなたに許してくれるものですが、不思議な、または奇妙な振る舞いをする可能性があります。 –

答えて

8

削除演算子は少し微妙です。あなたは

delete m; 

を書く場合、このコードの意味は、「mがで指しているメモリを再利用」です。言い換えれば、ではなくはポインタmに何かを実行するのではなく、オブジェクトmを指します。例えば、この図では:あなたがdelete mを記述する場合

 +-----+ 
m --> | 137 | 
     +-----+ 

ポインタm値137と整数を指し、次いで137を保持しているメモリが再利用されるが、m自体はそのままです。他のオブジェクトまたはNULLを指すように再割り当てすることはできますが、もはや存在しないため、以前の値を参照し続けるべきではありません。

0

int main() 
    { 
     int* m; 
     m = new int; 
     *m = 14; 
     cout << *m << " "; 
     delete m; 
     *m = 12; 
     cout << *m; 
    } 

は "未定義" です。それは動作する可能性があります。それはできません。それはほとんど確かに(tm)するのは本当に悪いことです。

2

コンパイラはこれをチェックしません。 lintのようなツールがこれをチェックします。はい、時々あなたは削除されたメモリを使用して逃げることができますが、未定義の動作です。メモリはもはやあなたに属していないので、プログラム中の別のオブジェクトによって使用されているメモリを書き込むリスクがあります。あなたのプログラムがとてもシンプルで、これが起こらないからです。

2

あなたのコードは正しくありません。

delete m;の後に、ポインタmは、メモリ内の有効なint変数を指していません。そのあとでこのポインタを逆参照すると、未定義の動作が発生します。プログラムは予期せぬ動作をし、バグの原因となる可能性があります。

一部のコンパイラでは、「削除された」値(ポインタではありません)に特性値(たとえば、0xFEEEFEEE)を埋め込むことで、コード内でそのようなエラーを見つけるのに役立ちます。これにより、デバッグ中に、削除されたメモリを指すポインタを使用しようとしていることに気付くことができます。

1

delete mを呼び出した後、mが指し示すメモリが割り当て解除され、システムによって再割り当てされる可能性があります。しかし、mはまだその場所を指しています。つまり、再度参照/使用を選択すると、の値が得られます。そうではないかもしれない。これは未定義の動作です。