• ベストアンサー

char配列のポインタ消去

char配列のポインタ消去 こんにちは。C++初心者で、現在ポインタと配列の関係を勉強しています。 以下のコードついて質問があります。 #include <stdio.h> extern void main () { char* str = "hello world."; printf(str); delete str; } コンパイルはうまくのですが、 いつもプログラムが正常に終了できません。 deleteをコメントアウトすると正常に終了します。 理由がわかる方いらっしゃるでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • BuriBuri4
  • ベストアンサー率28% (150/525)
回答No.1

アロケートしていない領域を開放しようとしているから異常終了する。 char* str = "hello world."; はスタティク領域に定義された固定文字列のアドレスをポインタ変数に代入しているだけでメモリーを確保していない。 delete str; はヒープ領域にnewで作られたインスタンスを削除する為の命令、strが指しているのはヒープ領域でもnewで作られたインスタンスでも無いので解放できない。

bmmorita
質問者

お礼

お返事ありがとうございます。大変参考になりました。 どうやら私はポインタの定義とメモリの確保をごっちゃにしていたようです。

その他の回答 (2)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.3

X3014 C++の規格では、deleteは次のように定義されています。 5.3.5 delete式 delete 式は、<<new 式>>が作った最派生オブジェクト、又はその配列を解体する。 つまり、既に他の方もおっしゃっていますが、 newで作ったもの以外はdeleteで解体してはいけません。 ^^^^^^^^^^^^^^^^^ 今回の場合、"hello world."は文字リテラル(文字列定数)に該当し、 プログラムのコンパイル時にメモリ配置が既に決定しているため、 この領域の解放は不要です。(というかできません。)

bmmorita
質問者

お礼

丁寧な解説ありがとうございます。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

newとdeleteは対応する、と憶えておきましょう。 今回のケースでは、deleteに対応するnewがstrに対して行われていない、というのが理由です。

bmmorita
質問者

お礼

わかりやすい説明、ありがとうございます。

関連するQ&A