多くの反復があるループでは、ループの開始時にスペースを割り当て、作業を行い、最後に割り当てを解除します。そんな感じ:
....
while(...){
list=malloc(N);
do_some_work_with_list(...)
free(list)
}
ここでフラグメンテーションが発生しますか?
PS私はすでにこの質問を投稿しようとしていますが、後で見つけることができませんでした。重複していたらごめんなさい
多くの反復があるループでは、ループの開始時にスペースを割り当て、作業を行い、最後に割り当てを解除します。そんな感じ:
....
while(...){
list=malloc(N);
do_some_work_with_list(...)
free(list)
}
ここでフラグメンテーションが発生しますか?
PS私はすでにこの質問を投稿しようとしていますが、後で見つけることができませんでした。重複していたらごめんなさい
まあ、それは依存します。他の割り当てが発生しない場合、割り当てられたチャンクは次のチャンクを割り当てる前に解放されるため、断片化は発生しません。ただし、do_some_work_with_list
返される前に解放されていないメモリを割り当てると、断片化が発生する可能性があります。また、他のスレッド、ライブラリ呼び出しなどが割り当てられている場合、断片化が発生する可能性があります。
これは、プラットフォームのメモリ管理手法 (最大空きブロックを最初に割り当てる / 最適な空きブロックを最初に割り当てるなど) と、ヒープ メモリ内の割り当ての現在の状態に完全に依存します。
ヒープは動的メモリ割り当ての場所であるため、割り当てに十分な大きさの単一のブロックが見つかった場合、後でメモリを解放すると断片化は発生しません。以前にヒープに存在した断片化のために単一のブロックが見つからない場合、このコードによって断片化が増加する可能性があります (システムで実行されている他のスレッドが同時にメモリを割り当てる可能性があることも考慮してください)。