[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
質問
私たちは皆、割り当てられたすべてのポインタを解放しなければならないと教えられています。 しかし、メモリを解放しないことによる本当の代償について、私は少し興味があります。明らかなケースとして、たとえば
malloc()
がループ内部やスレッド実行の一部で呼び出された場合、メモリリークを起こさないように解放することは非常に重要なことです。 しかし、次の2つの例を考えてみてください。
まず、次のようなコードがあった場合。
int main()
{
char *a = malloc(1024);
/* Do some arbitrary stuff with 'a' (no alloc functions) */
return 0;
}
ここで、実際の結果はどうなのでしょうか? 私の考えでは、プロセスが死ぬとヒープスペースはどうせなくなるので
free
(しかし、私はクロージャ、保守性、および優れた実践のために、いずれにせよそれを持つことの重要性を認識しています)。 この考え方は正しいのでしょうか?
次に、シェルのような動作をするプログラムがあるとします。 ユーザーは、次のような変数を宣言することができます。
aaa = 123
そして、それらは後で使用するために何らかの動的なデータ構造に保存されます。 明らかに、何らかの*alloc関数(ハッシュマップ、リンクリスト、そのような何か)を呼び出すようなソリューションを使用することは明らかだと思われます。 この種のプログラムにおいて
malloc
なぜなら、これらの変数はプログラム実行中常に存在しなければならず、静的に割り当てられた領域でこれを実装する良い方法は(私が見る限り)ないからです。 メモリが割り当てられ、プロセスの終了時に解放されるだけというのは、設計上よくないのでしょうか? もしそうなら、代替案は何でしょうか?
解決方法は?
最近のほとんどのオペレーティングシステムは、プログラムが終了した後、割り当てられたメモリ領域をすべて回復します。 唯一の例外は Palm OS のようなもので、プログラムの静的ストレージとランタイムメモリがほとんど同じものなので、解放しないことでプログラムがより多くのストレージを占有する可能性があることでしょう。 (ここでは推測に過ぎませんが)
ですから、一般的には、必要以上のストレージを持つことによるランタイムコストを除けば、何の害もありません。 確かに、あなたが挙げた例では、使用される可能性のある変数のメモリはクリアされるまで残しておきたいと考えています。
しかし、不要になったらすぐにメモリを解放し、プログラム終了時にまだ残っているものを解放するのが良いスタイルとされています。 むしろ、自分が使っているメモリを把握し、まだ必要かどうかを考える練習になります。 そうしないと、メモリーリークが発生する可能性があります。
一方、終了時にファイルをクローズするようにという同様の注意は、より具体的な結果をもたらします。そうしないと、ファイルに書き込んだデータがフラッシュされないかもしれないし、一時ファイルであれば終了時に削除されないかもしれないのです。 また、データベース・ハンドルはトランザクションをコミットし、用が済んだらクローズすべきです。 同様に、C++やObjective Cのようなオブジェクト指向言語を使っている場合、使い終わったときにオブジェクトを解放しないと、デストラクタが呼ばれず、そのクラスが担当しているリソースがクリーンアップされない可能性があります。
関連
-
Solve Dev-c++ [エラー] 'for' ループの初期宣言は、C99 または C11 モードでのみ許可されます。
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
[解決済み] C関数から文字列を返す
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?
-
[解決済み] C 言語の配列へのポインタ/ポインタの配列の曖昧さ解消
-
[解決済み] なぜ16進数には0xがつくのですか?
-
[解決済み] C言語で変数はメモリのどこに格納されていますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
Solve Dev-c++ [エラー] 'for' ループの初期宣言は、C99 または C11 モードでのみ許可されます。
-
C 言語のポインタ配列のポインタ型、ポインタに値を割り当てるために配列名を使用、コンパイル時の警告:互換性のないポインタ型からの初期化
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
[解決済み] mallocで文字列を確保する
-
[解決済み] flexible array member not at end of structエラーの原因は何ですか?
-
[解決済み] Windows用Cコンパイラ?[クローズド]
-
[解決済み] Linuxカーネルにおけるcontainer_ofマクロの理解
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] ストラクチャーとユニオンの違い