電子書籍の厳選無料作品が豊富!

c言語のメモリリークについての質問

c言語初心者のため、メモリリークについて質問させていただければと存じます。
下記のコードで、

char* char_p = "char1";
char_p = "char2"; // ←メモリリーク?

2行目の部分は、
"char1"のメモリ領域が確保されたままで、解放できなくなってしまうので、
メモリリークを起こして問題な気がするのですが、実際はどうなのでしょうか?
よろしくお願いいたします。

A 回答 (4件)

プログラムを起動したとき、あらかじめ分かっているデータ(文字列定数等)や変数(グローバル変数や静的変数)用の場所としてメモリが確保されます。



この確保されたメモリをデータ領域といいますが、プログラムの実行中に増えたり減ったりはしません。プログラムの起動から終了まで常に一定量で、プログラム終了時に開放されます。

質問者さんが書かれたコードの"char1"と"char2"というデータ(文字列定数)はこのデータ領域に置かれます。

先述したようにデータ領域は常に一定量で確保も開放もできないのでそもそもリークという現象はないです。

メモリを動的に確保できる場所をヒープ領域といいますが、このヒープ領域で確保したメモリを開放し忘れるとリークという現象が起こります。

自動変数(関数の冒頭で宣言する普通の変数)は、スタック領域と呼ばれる場所に確保されます。関数が終了した時点で確保したメモリは自動的に開放されます。

スタック領域も大きさが決まっており、この大きさ以上のメモリを確保しようとすると、「スタックオーバフロー」というエラーが起きます。
    • good
    • 0
この回答へのお礼

詳しいご回答ありがとうございます。
ご指摘の通り、実行時にデータ領域が確保され、その領域が動的に変化しないので、
ヒープ領域に動的に確保でき、メモリを解放しないとリソースが減っていくメモリリークとは違いますね。
大変参考になりました。ありがとうございます。

お礼日時:2010/01/01 16:42

メモリリークやメモリ確保、ポインタ等の理解が少し不足しているようですが、この式の場合、char* char_pのところで、char_pというアドレスに値を入れておく箱を用意しています。

その中に"char1"という値を格納しています。

そのあと、そのchar_pのはこの中身を"char2"で上書きしているだけですので、使用メモリは増えていません。

メモリリーク、メモリ確保については他の方の説明やネットなどを調べてみてください。
    • good
    • 0
この回答へのお礼

正月にもかかわらず、素早いご回答ありがとうございます。

お礼日時:2010/01/01 16:37

ポインタ値を失ったのはプログラム起動時にOSが確保した領域です。


起動時に確保された領域は終了時に解放されますからリークとは言い難いかと。
これがリークなら printf("Hello, World\n") もリークということになりますね。
    • good
    • 0
この回答へのお礼

大晦日にもかかわらず、素早いご回答ありがとうございます。
何を持ってメモリリークと定義するのかを考える必要がありそうですね。
ありがとうございました。

お礼日時:2010/01/01 16:36

mallocなどの関数で動的に確保した領域を


freeなどの関数で開放することを忘れてしまうことを
メモリリークと称していると思います。

もしそうならば、おたずねの件は該当しないですね。
    • good
    • 0
この回答へのお礼

大晦日にもかかわらず、素早いご回答ありがとうございます。

お礼日時:2010/01/01 16:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!