1

このコードを見てください

int i = 10;                                     //line 1 
int *p = &i;                                    //line 2  
delete p;                                       //line 3 
cout << "*p = " << *p << ", i = " << i << endl; //line 4  
i = 20;                                         //line 5  
cout << "*p = " << *p << ", i = " << i << endl; //line 6  
*p = 30;                                        //line 7
cout << "*p = " << *p << ", i = " << i << endl; //line 8  

このコードの結果は何ですか?特に3、5、7行目は?それらは未定義の動作を呼び出しますか?出力はどうなりますか?

編集:g ++を使用して実行してみましたが、コンパイルして正常に実行されています!私はWindows7でMinGWを使用しています。

この文脈でスタンダードは何と言っていますか?

4

3 に答える 3

5

newを使用して動的にポインタを割り当てたことがある場合は、ポインタのみを削除できます。この場合、newを使用してポインターを割り当てていませんが、int型のローカル変数を指すようにポインターを定義して初期化しました。

newを使用して動的に割り当てられていないポインタでdeleteを呼び出すことは、UndefinedBehaviorと呼ばれるものです。要するに、それはそのようなコードが実行されたときに地球上の何かが起こる可能性があり、この地球上の誰にも少し不満を言うことができないことを意味します。

于 2010-12-03T09:05:28.537 に答える
1

delete p;はUBであるため、それ以上の動作を予測したり、信頼したりすることはできません。プログラムがすぐにクラッシュしたり、すべてのお金を費やしたり、単に終了しmain()て何も起こらなかったふりをしたりする可能性があります。

于 2010-12-03T09:01:59.470 に答える
0

3行目は、ヒープ上にないアドレスのメモリを削除しようとしているため、明らかに未定義の動作です。

于 2010-12-03T09:02:25.287 に答える