mallocが動的にmemを割り当てるため、理解できることから、そのmemを解放して再度使用できるようにする必要があります。あなたはmalloc関数(つまり、あなたはそれを解放することになっているか) すべてのmalloc呼び出しを解放する必要があります
- (私はこれについて明確な答えを見つけることはできません。
mallocが動的にmemを割り当てるため、理解できることから、そのmemを解放して再度使用できるようにする必要があります。あなたはmalloc関数(つまり、あなたはそれを解放することになっているか) すべてのmalloc呼び出しを解放する必要があります
発信者はそれを解放する必要があります(または解放するようにしてください)。つまり、リソースを作成して返す関数は、解放する方法を正確に文書化する必要があります。
「プロセス」の定義の一部として、プログラムが終了するとほとんどのOSがメモリを解放します。 Cの標準は何が起こるか気にせず、プログラムの範囲外です。すべてのOSに完全なプロセス抽象化があるわけではありませんが、デスクトップスタイルのOSは確かにそうです。
あり、その前にそれを解放する主な理由:
解放しない漠然ともっともらしい理由は、次のとおりです。
フリーズの理由は、ほとんど常にその理由を上回ります。
私はこの答えを他のものよりも受け入れた理由は、ポインタを返す代替のアプローチが提案されたからです。他の回答に間違いはありません – RC1140
私は、メモリを解放せずに、悪用されたままにしておくと、特にメモリを増やしてから使用することをお勧めします。 https://en.wikipedia.org/wiki/Buffer_overflow#Heap-based_exploitation – Caperneoignis
はい。あなたがmallocなら、あなたは自由にする必要があります。あなたは無料でいない場合、あなたのプログラムが実行されている間、メモリリークを保証しています。
無料です。
常に。
期間。
+1いつも良い習慣です。例外はありません。プログラムが終了すると、スキップすることができます。通常は終了しないサーバープロセスはどうですか?漏れは大丈夫だと思う習慣に入らないでください。 – EvilTeach
はい、malloc()
へのすべての呼び出しは、free()
への呼び出しと一致する必要があります。
free()
が@ソフトウェアモンキー、それらはGNU番号ではなく、Unixのマニュアルセクションです。http://en.wikipedia.org/wiki/Man_pageを参照してください。 –
とにかく「グヌー数」とは何ですか? –
彼らは何でも、この文脈では属しません。しかし、彼らが何らかの利益をもたらすと思うなら、それらを戻すことを自由にしてください。 –
1)あなたは、通常のメモリを解放したいのと同じ方法、すなわち
p = func();
//...
free(p);
トリックはあなたが常にそれを行うことを確認することである...
2)一般的に言って、はい。しかし、あなたは良い実践としてあなたが使用しているメモリを解放する必要があります。メモリを解放する場所を見つけ出す時間を費やしているだけで、怠け者になっています。
あなたはmalloc
によって作成されたメモリへのポインタを持っている場合は、free
そのポインタを使用して、そのメモリをINGのは、正しいことを行います。はい、いくつかの魔法が関わっています。これはコンパイラによって処理されます。
はい、メモリ解放を無視してアプリケーションを終了すると、OSはメモリを解放します。しかし、それを未処理のままにするのは悪い習慣とみなされます。 OSは(特に組み込み設定で)正しいことをしないかもしれませんし、適時にそれをしないかもしれません。また、プログラムを継続的に実行していると、メモリが大量に消費され、最終的にメモリが消費され、メモリ不足とクラッシュする可能性があります。
...のは、一度にこれらの一点を見てみましょうあなたはmalloc
で作成された知っているchar *
を返す場合は、[はい、それを解放する責任があります。 free(myCharPtr)
でそれを行うことができます。
OSはメモリを永久に失うことはなく、永遠に失われることはありませんが、アプリケーションが終了した直後に再利用される保証はありません。それはオペレーティングシステムに依存します。
自分で関数を記述する場合は、それを避けてください。
ライブラリ関数を使用している場合:ドキュメントを参照してください。
2番目の質問については、終了する前に解放することをおすすめします。技術的には傷つきませんが、大きなプロジェクトでコードを再利用したい場合は、最初に正しいクリーンアップを書いたことに感謝します。
すべてのmallocを解放しなければならないとは言いませんが、プログラムがどれだけ長く実行されても、割り当てられた割り当て数(および合計サイズ)解放される。この数は静的な定数である必要はありませんが、何か他の点で指定可能でなければなりません(例:このプログラムはウィジェットを処理します;最大のウィジェットの各クイズに1つの64バイトの構造体を割り当てます)。最大のウィジェットのサイズを事前に知ることはできませんが、例えばウィジェットを処理するのに必要な一時記憶域がそのサイズの2乗に比例することを知っているなら、最大のウィジェットが十分に小さく、メモリの総量がかなり少なくなることは間違いないだろう。
C標準には、単一のプログラムの実行以外のシステム環境という概念がないため、「プログラムが終了した後」に何が起こるかを指定することはできません。同時に、malloc
で得られたメモリは、でコールする前に解放する必要がありますか、またはからコールするか、またはmain
から戻る必要があります。手動でメモリを解放せずに終了するというのはかなり明らかですすべてのファイルを閉じずにexit
を呼び出すと、自動的に閉じられます(フラッシングを含む)。あなたの特定のプログラムに多くを依存するかどうか、あなたべきかべきではないコールfree
、用として今
、。
free
必要があります。これまでのところ、図書館のコードについてしか話しませんでした。この時点で残されているのは、アプリケーション自体によって、またはライブラリによってアプリケーションに代わって割り当てられることだけです。私の見解では、私はそれが非正義であることを認めます、そのようなオブジェクトを解放することは、不必要ではなく有害であるということです。私がこれを言う主な理由は、ほとんどの長期間使用されているアプリケーションでは、かなりの量の割り当てられたメモリが蓄積されていることです(ワープロやブラウザーの履歴の取り消しバッファーを考える)。適度にロードされたシステムでは、このデータの多くは、アプリケーションが終了するまでにディスクにスワップされています。あなたはそれを解放したい場合は、
あなたが解放する必要がありばかばかしいの名の下に、こののすべて」を実行すること、他のまだ使用中のアプリケーションのデータがスワップアウトを取得させる
短命のアプリケーションではそれほど大したことではありませんが、すべてのメモリを解放する必要がない場合は、単一の線形タスクと終了を実行する短命アプリケーションの実装を単純化することができます割り当てます。ほとんどのUNIXコマンドラインユーティリティを考えてみてください。終了する前に、すべてのコンパイル済み正規表現を解放するために、sed
のためのループを書くことにはどんな使い方がありますか?プログラマーの時間をより生産的なものに費やすことはできませんでしたか?
あなたは何をすべきかについて決定的な答えは見つけられませんが、標準で何をしなければならないかについての決定的な答え(それは気にしません)と、すべての現実のオペレーティングシステムDOS - どちらも気にしない)。気にしている組み込みシステムは、おそらく 'exit()'の概念を持っていないかもしれませんが、私が間違っていることを証明するために誰かが立ち上がると確信しています。 :-) –