- ベストアンサー
文字列のメモリ保持期間とポインタについての疑問
- 文字列のメモリ保持期間とポインタについて説明します。
- ポインタで確保された文字列のメモリは明示的に開放する必要があります。
- 文字列を返却したり、他のオブジェクトに格納する場合は注意が必要です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
場合によります。 >char* s; >s = "abcdefg"; >この"abcdefg"により確保された領域がいつまで保持されるのかわかりません。 >・これを実行しているメソッドを抜けるまでなのか? >・free(s)するまでなのか?(free(s)しなければいけないのか?) この場合は、プログラムがメモリにロードされた時点でメモリ上に"abcdefg"が配置され、 その先頭アドレスを char型のポインタ変数sに代入しているだけです。 # 「文字列リラテル」で検索されるとよいでしょう。 で、メモリ上に配置され"abcdefg"は、プログラムが終了するまで有効ですから解放する必要はありません。 # ちなみに「定数」扱いになりますので普通は書き換えできません。 >オブジェクトを生成して、そのメンバ変数に >obj1->field1 = "value"; >というように格納して利用する 実装にもよりますが…たいていクラス内で「内容を変更する」必要がある場合は、領域を確保して「コピー」しているかと。 free()が必要なのは、malloc()やcalloc()等で明示的に確保した場合…になります。 標準関数でどの程度あるかは不明ですが… 「呼び出し元が解放の責任を負う」という作りの関数を使用した場合は、当然free()は必要ですが。 # strdup()とか。
その他の回答 (2)
- magicalpass
- ベストアンサー率58% (378/648)
> この"abcdefg"により確保された領域がいつまで保持されるのかわかりません。 "abcdefg"は文字列リテラルとしてソースコードに直書きされています。 こういうものはプログラムがメモリ上にロードされた時に、静的なメモリ空間に割り当てられます。 (PCだと実行時にRAM上にロードされますが、マイコン用の組み込みソフトなどではROM上のメモリ空間に割り当てられることもあります) したがって、このメモリ領域はプログラムが実行された時から終了するまで保持されます。 もっとも、"abcdefg"はずっと存在しますが、それを指してるポインタ変数「s」はローカル変数なので、関数を抜けた時点で消滅します。(static宣言されている場合は別ですが) そういうわけで、関数の戻り値で他に渡しても構いませんし、free()する必要はありません。
お礼
ダブルクォートで作成した文字列は動作環境によって適切な領域に保持されるんですね。 ありがとうございました。
- Yanch
- ベストアンサー率50% (114/225)
文字列がリテラルの場合、生存期間は、プログラムをメモリに読み込んだ時点から、 プログラム終了時までです。 リテラルをfreeしたりしちゃいけませんよ。 プログラム終了時に、自動的に開放されます。
お礼
ダブルクォートで作成した文字列はずっと保持されるのですね・・、知りませんでした。
お礼
ダブルクォートで作成した文字列は静的な定数として扱うんですね。 文字列の内容を変更するような場合には、メモリを確保してそこに内容をコピーしてから使用するというのは初耳でした。