使用する必要があるメモリの正確なサイズがわからない場合は、動的割り当て(malloc
)が必要です。たとえば、ユーザーがアプリケーションでファイルを開いたときなどです。ファイルの内容をメモリに読み込む必要がありますが、ユーザーが実行時にその場でファイルを選択するため、ファイルのサイズは事前にわかりません。したがって、基本的にmalloc
は、作業するデータのサイズが事前にわからない場合に必要です。少なくともそれがを使用する主な理由の1つですmalloc
。コンパイル時にサイズがわかっている(さらに、変更したくない)単純な文字列を使用した例では、動的に割り当てることはあまり意味がありません。
少しトピックから外れていますが、...を使用するときにメモリリークが発生しないように注意する必要がありますmalloc
。このコードを考えてみましょう:
int do_something() {
uint8_t* someMemory = (uint8_t*)malloc(1024);
// Do some stuff
if ( /* some error occured */ ) return -1;
// Do some other stuff
free(someMemory);
return result;
}
このコードの何が問題になっていますか?malloc
との間に条件付きreturnステートメントがありfree
ます。最初は大丈夫に思えるかもしれませんが、考えてみてください。エラーが発生した場合は、割り当てたメモリを解放せずに戻ります。これは、メモリリークの一般的な原因です。
もちろん、これは非常に単純な例であり、ここで間違いを見つけるのは非常に簡単ですが、ポインタ、malloc
s、free
s、およびあらゆる種類のエラー処理が散らかった数百行のコードを想像してください。物事は本当に乱雑になる可能性があります。これは、適用可能な場合にCよりも現代のC ++をはるかに好む理由の1つですが、それはまったく別の話題です。
そのためmalloc
、を使用するときは常に、メモリがfree
できるだけ少ないことを確認してください。
malloc()
失敗する可能性があります!