• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:文字列のメモリ保持期間とポインタについてわからないので教えてください。)

文字列のメモリ保持期間とポインタについての疑問

このQ&Aのポイント
  • 文字列のメモリ保持期間とポインタについて説明します。
  • ポインタで確保された文字列のメモリは明示的に開放する必要があります。
  • 文字列を返却したり、他のオブジェクトに格納する場合は注意が必要です。

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

場合によります。 >char* s; >s = "abcdefg"; >この"abcdefg"により確保された領域がいつまで保持されるのかわかりません。 >・これを実行しているメソッドを抜けるまでなのか? >・free(s)するまでなのか?(free(s)しなければいけないのか?) この場合は、プログラムがメモリにロードされた時点でメモリ上に"abcdefg"が配置され、 その先頭アドレスを char型のポインタ変数sに代入しているだけです。 # 「文字列リラテル」で検索されるとよいでしょう。 で、メモリ上に配置され"abcdefg"は、プログラムが終了するまで有効ですから解放する必要はありません。 # ちなみに「定数」扱いになりますので普通は書き換えできません。 >オブジェクトを生成して、そのメンバ変数に >obj1->field1 = "value"; >というように格納して利用する 実装にもよりますが…たいていクラス内で「内容を変更する」必要がある場合は、領域を確保して「コピー」しているかと。 free()が必要なのは、malloc()やcalloc()等で明示的に確保した場合…になります。 標準関数でどの程度あるかは不明ですが… 「呼び出し元が解放の責任を負う」という作りの関数を使用した場合は、当然free()は必要ですが。 # strdup()とか。

yukinori_111
質問者

お礼

ダブルクォートで作成した文字列は静的な定数として扱うんですね。 文字列の内容を変更するような場合には、メモリを確保してそこに内容をコピーしてから使用するというのは初耳でした。

その他の回答 (2)

回答No.3

> この"abcdefg"により確保された領域がいつまで保持されるのかわかりません。 "abcdefg"は文字列リテラルとしてソースコードに直書きされています。 こういうものはプログラムがメモリ上にロードされた時に、静的なメモリ空間に割り当てられます。 (PCだと実行時にRAM上にロードされますが、マイコン用の組み込みソフトなどではROM上のメモリ空間に割り当てられることもあります) したがって、このメモリ領域はプログラムが実行された時から終了するまで保持されます。 もっとも、"abcdefg"はずっと存在しますが、それを指してるポインタ変数「s」はローカル変数なので、関数を抜けた時点で消滅します。(static宣言されている場合は別ですが) そういうわけで、関数の戻り値で他に渡しても構いませんし、free()する必要はありません。

yukinori_111
質問者

お礼

ダブルクォートで作成した文字列は動作環境によって適切な領域に保持されるんですね。 ありがとうございました。

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

文字列がリテラルの場合、生存期間は、プログラムをメモリに読み込んだ時点から、 プログラム終了時までです。 リテラルをfreeしたりしちゃいけませんよ。 プログラム終了時に、自動的に開放されます。

yukinori_111
質問者

お礼

ダブルクォートで作成した文字列はずっと保持されるのですね・・、知りませんでした。

関連するQ&A

専門家に質問してみよう