- ベストアンサー
char配列のポインタ消去
char配列のポインタ消去 こんにちは。C++初心者で、現在ポインタと配列の関係を勉強しています。 以下のコードついて質問があります。 #include <stdio.h> extern void main () { char* str = "hello world."; printf(str); delete str; } コンパイルはうまくのですが、 いつもプログラムが正常に終了できません。 deleteをコメントアウトすると正常に終了します。 理由がわかる方いらっしゃるでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
アロケートしていない領域を開放しようとしているから異常終了する。 char* str = "hello world."; はスタティク領域に定義された固定文字列のアドレスをポインタ変数に代入しているだけでメモリーを確保していない。 delete str; はヒープ領域にnewで作られたインスタンスを削除する為の命令、strが指しているのはヒープ領域でもnewで作られたインスタンスでも無いので解放できない。
その他の回答 (2)
- aris-wiz
- ベストアンサー率38% (96/252)
X3014 C++の規格では、deleteは次のように定義されています。 5.3.5 delete式 delete 式は、<<new 式>>が作った最派生オブジェクト、又はその配列を解体する。 つまり、既に他の方もおっしゃっていますが、 newで作ったもの以外はdeleteで解体してはいけません。 ^^^^^^^^^^^^^^^^^ 今回の場合、"hello world."は文字リテラル(文字列定数)に該当し、 プログラムのコンパイル時にメモリ配置が既に決定しているため、 この領域の解放は不要です。(というかできません。)
お礼
丁寧な解説ありがとうございます。
- D-Matsu
- ベストアンサー率45% (1080/2394)
newとdeleteは対応する、と憶えておきましょう。 今回のケースでは、deleteに対応するnewがstrに対して行われていない、というのが理由です。
お礼
わかりやすい説明、ありがとうございます。
お礼
お返事ありがとうございます。大変参考になりました。 どうやら私はポインタの定義とメモリの確保をごっちゃにしていたようです。