自動変数へのポインターを削除する[複製
-
30-09-2019 - |
質問
この質問にはすでに答えがあります:
このコードを見てください
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 ++を使用して実行しようとしましたが、コンパイルして正常に実行しています! Windows 7でMingwを使用しています。
この文脈で標準は何と言っていますか?
解決
Newを使用して動的に割り当てた場合、ポインターのみを削除できます。この場合、新しいタイプintのローカル変数を指すように、新しいものを使用してポインターを割り当てていませんが、単純に定義および初期化されました。
Newを使用して動的に割り当てられていないポインターで削除を呼び出すことは呼ばれるものです 未定義の動作. 。要するに、それは、そのようなコードが実行されたときに地球上のすべてが起こる可能性があり、あなたがこの惑星の誰にも少し苦情を申し立てることができないことを意味します。
他のヒント
delete p;
UBであるため、さらなる動作を予測または依存することはできません。あなたのプログラムはすぐにクラッシュしたり、すべてのお金を使ったり、から出て行くかもしれません main()
そして、何も起こらなかったふりをします。
ヒープにないアドレスでメモリを削除しようとしているため、行3は間違いなく未定義の動作です。
所属していません StackOverflow