malloc
exceptを使用したメモリ割り当て中に発生する可能性のあるエラーは何out of memory
ですか? これらのエラーを処理するための最善の戦略は何ですか?
メモリ割り当てに失敗した場合でもポインタを解放するout of memory exception
必要がありますか?
malloc
exceptを使用したメモリ割り当て中に発生する可能性のあるエラーは何out of memory
ですか? これらのエラーを処理するための最善の戦略は何ですか?
メモリ割り当てに失敗した場合でもポインタを解放するout of memory exception
必要がありますか?
C には例外がありません (とにかく言語で使用することはできません)。そのため、malloc
失敗を通知できる唯一の方法は null ポインターを返すことです。したがって、戻り値を確認する必要があります。0 の場合、(何らかの理由で) 割り当てが失敗し、メモリが割り当てられていません。解放するものはありません。それ以外の場合は、要求された量 (*) の割り当てが成功し、不要になったときにメモリを解放する必要があります。
(*) オーバーフローに注意してください:パラメータmalloc
を取りsize_t
ますが、これは符号なしの数値である可能性が最も高いです。size * sizeof(int)
符号なしでバイトを要求しsize
、乗算がオーバーフローした場合 ( の値を取得する際にエラーが発生した可能性がありますsize
)、結果は小さい数値になります。 malloc()
は、null 以外で返されるこの少数のバイトを割り当て、実際の (大きい) 値に基づいて返された配列にインデックスを付けsize
ます。
これは製品プラグのように見えますが、さまざまな種類のメモリ割り当てエラーについては、そのような割り当てミスを含むメモリ管理エラーを見つけるためのツールであるCheckPointerに関する記事で読むことができます。
検出可能なエラーはメモリ不足のみです... すでに解放されているメモリを解放するなどの他のエラーは、クラッシュにつながる可能性があります。
C でメモリ不足をチェックするための 1 つの戦略は、メモリ不足をチェックする malloc と realloc (xmalloc と xrealloc と呼ぶこともできます) のラッパーを使用することです。メモリー・プールを解放しようとして、割り当てを再試行している可能性があります。これにより、すべてのテストが 1 か所にまとめられ、一貫した失敗メッセージが生成され、すべての割り当て試行の失敗がチェックされることが保証されます。考えられる欠点については、以下のコメントで説明しています。
歴史的に、この戦略は C コードではまれでした (この古代言語で書かれたコード全体で一般的に品質が低いことと一致しています) が、最近ではいくつかの成熟したライブラリ フレームワークがこの種のことを組み込んでいます (ただし、実装には必要なものが残っていますが、コメントを参照してください)。下)。強く推奨されるもう 1 つのアプローチは、C を放棄して、より現代的な言語 (場合によっては C++) に移行することです。C++ では、失敗new
するとbad_alloc
例外が発生します。
あなたの質問については... mallocが失敗した場合、NULLを返します。free へのポインターはありません。(free(NULL) はノーオペレーションです)。再割り当てが失敗した場合、元の割り当ては変更されません。これらのことは、 http://pubs.opengroup.org/onlinepubs/7908799/xsh/realloc.htmlなどのマニュアル ページまたは仕様を読むことで確認できます。