- ベストアンサー
malloc関数 free開放とはなんですか?
malloc関数を用いてメモリを確保した後、 必ずfreeで開放を行わなければならないですよね? この開放とはどういう意味なのでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
アプリケーション等のプログラムでは、malloc()を呼び出すことで、システム(OS)からメモリを 必要分だけ借りています。 これは、システムの持つ借用台帳に記録されていて、そこのメモリは他のプログラムで 使えない様にしています。(占有ですね) そして、プログラムがメモリを使い終わったら、システムへ返却しなければなりません。 メモリの返却に使うのがfree()で、これを呼び出すことで、借り受けていたメモリはシステムへ 返却され、借用台帳からも消去されます。これが開放です。 簡単に言うと、アプリケーションの占有から開放する、と覚えればよろしいかもしれません。
その他の回答 (4)
- rinkun
- ベストアンサー率44% (706/1571)
必ず開放する必要があるとは言えないですね。 freeはAno.3に書かれているように以降のmallocで使えるようにマーク付けするだけでOSへの返却はしないことも多いです。 昔のUNIXなどではメモリ取得の方法はあってもOSにメモリを返す方法はプロセス終了以外にないですし。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
「確保」の意味はOKですね? 解放というのは、単に、「確保したものは、確保しっぱなしだと迷惑だから、いらなくなったら解放してね」とい意味合いです。 こういうことなので、「malloc() した領域は必ず free() で解放しなければならい」かといえば、まあ、そうでもありません。 アプリケーションソフトの終了時点など、「そのアプリケーションではこの後絶対にメモリを追加で使用することはあり得ない」場合に、わざわざ free() するのは無駄という意見もかなりあります。 (少なくとも、この場合には、free() しないと行儀が悪いという事はあっても、メモリリークなどの実害はありません) 逆に、アプリケーションの中で、頻繁にメモリの確保を行うような場合、不要になった領域は、ちゃんと開放しないと、「これ以上メモリが確保できない」という事態が発生するかもしれません、 (この場合は、必ず解放が必要) また、malloc() や free() はあくまでも、そのアプリケーションの中の話なので、アプリケーションが終了したときの話(システム側にメモリを返却するとか)には関わりがありません。
- wormhole
- ベストアンサー率28% (1626/5665)
malloc(),free()の実装にもよりますが free()は、malloc()などで利用していいよという印付けですね。 google mallocやjemallocといった実装がありますから ソース見てみるといいですよ。
- D-Matsu
- ベストアンサー率45% (1080/2394)
大雑把に説明すると、malloc関数は「これだけメモリを使いたい」とOSに要求する関数で、freeは「malloc等で確保したメモリを使い終わった」ことをOSに通知する関数です。 この通知を行わないと、OS側ではメモリを使い終わったことが認識できず「誰も使えないメモリ領域」が出来ます(メモリリーク)。 まぁ、最近のOSなら大抵「終了したプロセスが解放を忘れたメモリ」は勝手に回収(ガベージコレクション)するんですが。
お礼
5名の皆さまの回答ありがとうございました。 みなさんとても分かりやすい説明でした。 BAには悩みましたが個人的に一番理解しやすかった人と言うことでこちらの回答者様にさせていただきました。 また、お礼についても内容的に同じ内容になるためこちらの回答者様にだけ書かせていただきます。すみません。