No.2ベストアンサー
- 回答日時:
アプリケーション等のプログラムでは、malloc()を呼び出すことで、システム(OS)からメモリを
必要分だけ借りています。
これは、システムの持つ借用台帳に記録されていて、そこのメモリは他のプログラムで
使えない様にしています。(占有ですね)
そして、プログラムがメモリを使い終わったら、システムへ返却しなければなりません。
メモリの返却に使うのがfree()で、これを呼び出すことで、借り受けていたメモリはシステムへ
返却され、借用台帳からも消去されます。これが開放です。
簡単に言うと、アプリケーションの占有から開放する、と覚えればよろしいかもしれません。
この回答へのお礼
お礼日時:2012/01/24 01:24
5名の皆さまの回答ありがとうございました。
みなさんとても分かりやすい説明でした。
BAには悩みましたが個人的に一番理解しやすかった人と言うことでこちらの回答者様にさせていただきました。
また、お礼についても内容的に同じ内容になるためこちらの回答者様にだけ書かせていただきます。すみません。
No.5
- 回答日時:
必ず開放する必要があるとは言えないですね。
freeはAno.3に書かれているように以降のmallocで使えるようにマーク付けするだけでOSへの返却はしないことも多いです。
昔のUNIXなどではメモリ取得の方法はあってもOSにメモリを返す方法はプロセス終了以外にないですし。
No.4
- 回答日時:
「確保」の意味はOKですね?
解放というのは、単に、「確保したものは、確保しっぱなしだと迷惑だから、いらなくなったら解放してね」とい意味合いです。
こういうことなので、「malloc() した領域は必ず free() で解放しなければならい」かといえば、まあ、そうでもありません。
アプリケーションソフトの終了時点など、「そのアプリケーションではこの後絶対にメモリを追加で使用することはあり得ない」場合に、わざわざ free() するのは無駄という意見もかなりあります。
(少なくとも、この場合には、free() しないと行儀が悪いという事はあっても、メモリリークなどの実害はありません)
逆に、アプリケーションの中で、頻繁にメモリの確保を行うような場合、不要になった領域は、ちゃんと開放しないと、「これ以上メモリが確保できない」という事態が発生するかもしれません、
(この場合は、必ず解放が必要)
また、malloc() や free() はあくまでも、そのアプリケーションの中の話なので、アプリケーションが終了したときの話(システム側にメモリを返却するとか)には関わりがありません。
No.3
- 回答日時:
malloc(),free()の実装にもよりますが
free()は、malloc()などで利用していいよという印付けですね。
google mallocやjemallocといった実装がありますから
ソース見てみるといいですよ。
No.1
- 回答日時:
大雑把に説明すると、malloc関数は「これだけメモリを使いたい」とOSに要求する関数で、freeは「malloc等で確保したメモリを使い終わった」ことをOSに通知する関数です。
この通知を行わないと、OS側ではメモリを使い終わったことが認識できず「誰も使えないメモリ領域」が出来ます(メモリリーク)。
まぁ、最近のOSなら大抵「終了したプロセスが解放を忘れたメモリ」は勝手に回収(ガベージコレクション)するんですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- 英語 Since there is no change in external dimensions, t 3 2023/04/07 23:34
- 英語 Since there is no change in external dimensions, t 1 2023/04/03 22:42
- Visual Basic(VBA) vba メモリ節約 3 2022/09/16 21:45
- ラジオ 「小さな小さな物語」の放送開始時期、西暦何年か? 2 2023/07/30 09:53
- 数学 多変数関数の微分とテイラー展開について 5 2022/04/24 16:55
- 格安スマホ・SIMフリースマホ 楽天モバイル 間違って10分(標準)通話かけ放題 を選択しましたが キャンセルできる? 1 2022/06/27 23:39
- UNIX・Linux fedoraのリポジトリのインストールで下記コマンドで$(rpm -E %fedora)の部分が分か 1 2023/01/29 15:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
メモリアロケーション異常の発...
-
C#で別クラスインスタンスのメ...
-
大容量のメモリ確保をスワップ...
-
エクセル キャッシュメモリー...
-
メモリのセグメント違反の解決...
-
ちなみに、for (i = 0; str[i] ...
-
ReadEventLogについて
-
FindFirstFile ハンドル開放
-
大量件数のINSERT or UPDATE を...
-
動的メモリとexit(C言語)
-
パソコンを閉じる時いつも休止...
-
メモリの増加に関して
-
メモリの消費量について
-
スーパーマリオのパワーアップ...
-
CFileのOpenで例外(998:メモ...
-
「memcpy」と「strcpy」について
-
C言語:関数のメモリ上でのサイ...
-
アプリケーション上の文字を画...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
「ヒープサイズの設定」て何?
-
C言語における再帰呼び出しの...
-
エクセルVBA 大容量CSVファイル...
-
動的メモリとexit(C言語)
-
エクセルのメモリ使用状況/Appl...
-
メモリが不足しています(VBA)
-
ファイルマッピング関数で失敗
-
大容量のメモリ確保をスワップ...
-
メモリのセグメント違反の解決...
-
EXCEL-VBAにてADOのレコードセ...
-
メモリ不足
-
エクセル キャッシュメモリー...
-
【C言語】再帰が時間がかかる...
-
C#のOutOfMemoryException発生...
-
closeとメモリの開放について
-
バッチファイルでの実行EXEのメ...
-
メモリの解放について VB6 VBA
-
「memcpy」と「strcpy」について
おすすめ情報