は例えば、私は文字列を持つためにポインタを設定するとします。プログラムを終了する前にフリー(文字列)を行う必要がありますか?
char *string = NULL;
size_t size = 0;
getline(&string, &size, stdin);
が終了する前に、プログラムをfree(string)
を実行する必要がありますか。 私は人で見ることができるように、malloc()
へのgetlineコールと私はそれを仮定しています。
は例えば、私は文字列を持つためにポインタを設定するとします。プログラムを終了する前にフリー(文字列)を行う必要がありますか?
char *string = NULL;
size_t size = 0;
getline(&string, &size, stdin);
が終了する前に、プログラムをfree(string)
を実行する必要がありますか。 私は人で見ることができるように、malloc()
へのgetlineコールと私はそれを仮定しています。
ソフトウェアにメモリリークがないように、はい、動的に割り当てたメモリにはfree
と呼ぶべきです。
メモリはプロセスが終了するとOSによって再利用されるため、使用可能なメモリが不足している場合を除き、大したことではありません。ただし、デーモンプロセスなど、バックグラウンドで実行されるソフトウェアを作成する場合は、free
を使用してメモリを解放することが非常に重要です。
正しい方法(tm)はfree
になり、その領域を再利用するためにOSに依存しないことが推奨されています。
"現代のオペレーティングシステムでは..."現代かどうかは同じです。 Cでは、プログラムが明示的にメモリを解放する必要はありません。すべてのCプログラムは、終了時にメモリを解放します。 –
ああ、私はそれを知らなかった。 Cで書かれたプログラムがカーネル(私が自分のコンピュータ組織クラスに書いたような小さな組み込みカーネル)からメモリを要求し、カーネルにスペースを必要としないことを知らせることなく終了することはできないのですか?プログラムが終了してもメモリリークが発生しますか?私はそれが悪いカーネルと呼ばれるかもしれないと思うが、原理的に不可能ではないように見える。 –
@JohnKugelman普遍的ではない - VxWorksなどのオペレーティングシステム - 非常に一般的に使用されているRTOSは、システムに単一プロセス、マルチスレッド、および動的リンクロードされたプログラム(メモリ保護はほとんどない) 。競合他社の多くは同様のモデルを使用していました。プログラムによってリークされたメモリがクリーンアップされませんでした。 これは、main()が1つしかないので、C標準にも違反しませんでした。 – marko
必要ありません。
別の回答に記載されているように、いくつかの理由があります。しかし、いくつかの理由もあります。フリーランを行うコードは、書き込み、デバッグ、および保守に余分な時間を要し、バグの余計な潜在的な原因です。
それぞれのプロジェクトが自分の状況に応じて選択しなければならない選択肢はありません。
これは必須ではありませんが、お勧めです。後でそれをリファクタリングして、それ自身の後にクリーンアップするコードを別のコンテキストに配置する方が簡単です。 – PSkocik
また、私はvalgrindが私にゼロリックレポートを与えるようにクリーンアップします。私が漏れがない場合、特定の漏れが有害(成長)しているのか、比較的無害であるのかを心配する必要はありません。 – PSkocik