Когда я использую malloc()
s и free()
s случайным образом, вложенным и с различными размерами, в какой-то момент память будет фрагментирована, поскольку эти операции оставляют большой список небольших областей памяти позади, которые являются несмежными и, следовательно, t быть выделен как одна большая часть.Фрагментация памяти
Несколько вопросов по этому поводу:
Когда это делается довольно часто, так что память вынуждена быть фрагментирован, а затем все эти области памяти являются
free()
d, Могу ли я считать, эти свободные районы конкатенация назад к ее первоначальному, смежному размеру?Когда я всегда делаю
malloc()
, а затемfree()
для той же памяти и никогда не гнездю эти вызовы. Разве фрагментация памяти в этом сценарии тоже при распределенных/освобожденных размерах всегда различна?
Все это зависит от реализации. Но, да, хороший менеджер памяти объединит смежные части свободной памяти. И да, если вы делаете 'malloc', за которым следует' free', и вы не вызываете никаких библиотечных функций, которые вызывают «malloc» между ними, тогда не должно произойти фрагментация. –
Вы можете запустить Valgrind с вашей программой http://www.valgrind.org и проверить ошибки выравнивания данных и утечки памяти. –
Трудно фрагментировать 64-разрядное адресное пространство. Конечно, вы можете легко фрагментировать его до такой степени, что вы больше не можете выделить объект с 10 ТБ, но, вероятно, у вас, по-видимому, не было 10-бит RAM. – MSalters