私はCアプリケーションを作成しており、mallocを使用してヒープ上にデータを作成しています。アプリケーションがアクティブな間は、このデータは常に永続的なので、私はMallocデータを決して「フリー」にしません。CアプリケーションでのMALLOCのリソース消費
私の質問は:このメモリはアプリケーション終了時に自動的に解放されるか、アプリケーションの完了時に手動でfree()を実行する必要がありますか?
私はCアプリケーションを作成しており、mallocを使用してヒープ上にデータを作成しています。アプリケーションがアクティブな間は、このデータは常に永続的なので、私はMallocデータを決して「フリー」にしません。CアプリケーションでのMALLOCのリソース消費
私の質問は:このメモリはアプリケーション終了時に自動的に解放されるか、アプリケーションの完了時に手動でfree()を実行する必要がありますか?
これは実装定義です。厳密にC標準に従うと、free
malloc
のすべてがアプリケーション終了前に行われます。
しかし、現代の汎用オペレーティングシステムは、あなたの後にクリーンアップされるので、これは一部の埋め込み型、昔ながらの、またはそれ以外のエキゾチックな環境でのみ関連します。
スタイルのポイントとして、割り当てられたブロックごとにfree
を試してみてください。クリーンなコードを書いてメモリリークを防ぐ習慣を身につけます。
これは解放されます。これは "プロセス"抽象化の驚異です。この実行プロセスが所有するすべてのリソースとメモリは、終了時に解放されます。
この抽象化には時間がかかりましたが、システムにとっては本当に素敵なサンドボックスです。実際に、殺害プロセスは、最終的な手段として、漏れやパフォーマンスが低下したバグのあるプログラムを修正するために使用されています(かなりの名前は"Process Rejuvenation"と呼ばれ、会議やジャーナルにも存在しますが実際には悪いデザインやコーディングのアドミッション)。
それでもオペレーティングシステムに依存しますが、ほとんどのOSはメモリを解放します。 –
@Let_Me_Be:少なくとも「プロセス」抽象化を持つもの:) –
@Let_Me_Be:プロセス終了後にクリーンアップしないOSについて言えますか? – Cratylus
このようなメモリを明示的にfree
する必要はありません。最高でもそれはあなたに何のメリットも与えませんし、最悪の場合、メモリに戻された多くのスワップアウトされたデータを、簿記ポインタを検査して破棄して、ユーザーのハードディスクを駄目にします。
-1ほとんどの非OOP言語で最もよく知られている方法の1つである「あなたが割り当てたものを常に解放する」を推奨するため-1。利点の1つは、コードを自己完結した状態に保つのに役立つので、別のアプリケーションでいくつかのコード(ライブラリルーチン?)を使用すると、割り当てられたブロックはアプリケーションが終了するまで保持されません。手間をかけずにコードを再利用することができます。さもなければ、あなたはいつ自由なものでなければならないものを見つけるのは難しいかもしれません。 – TheBlastOne
あなたが望むすべての-1を与えることができますが、私のアドバイスはより良い動作をするプログラムを提供します。 –
私はRと同意しがちですが、「決して」*と言っても過度に規範的と思われます。あなたのコードがライブラリコードであれば、使用されたリソースを解放するクリーンアップ機能を提供する必要があります。コールするかどうかは、アプリケーションに依存します。プロセスの終了時に大量のデータ構造を反復するだけで、それらを解放するだけです(これは、しばしばOSにメモリを返さないこともあります)。)は、時間のかかる忙しい作業である可能性があります。 – caf
私はmallocのすべてを「解放する」という声明や標準を含意するものは見つけられません。もちろん、ホストされている環境やプロセスの性質はC言語仕様の範囲外ですが、プログラムのメモリが終了時にOSに放棄されない「プログラム実行」という意味のOSは想像できません。 DOS。 OSなしの確かに組み込まれた環境では、「プログラムの実行」または「終了」という概念もないかもしれません。この場合、問題は無関係です。 –
@R ..:私は標準の準備ができていませんが、終了時にmallocされたメモリに何が起こるかは指定していません。以前のメインフレームのオペレーティングシステムでは、ユーザーごとに1つのアドレス空間しか持たないため、明示的な 'free'が必要なことを私は聞いたことがあります(これは単なる噂かもしれません)。 –