Фрагментация памяти
Когда я использую malloc()
и free()
случайным образом, вложенные и с разными размерами, в какой-то момент память будет фрагментирована, потому что эти операции оставляют большой список небольших областей памяти позади, которые являются несмежными и поэтому могут " t будет выделено как одна большая часть.
Несколько вопросов по этому поводу:
-
Если это делается довольно часто, так что память вынуждена быть фрагментирована, а затем все эти области памяти free()
d, могу ли я предположить, что эти свободные области объединены обратно в исходный смежный размер?
-
Когда я всегда делаю malloc()
, а затем free()
для одной и той же памяти и никогда не вставляю эти вызовы. Разве фрагментирована память в этом сценарии, когда распределенные/освобожденные размеры всегда разные?
Ответы
Ответ 1
Согласно ISO/IEC 9899: 201x → 7.22.3
Порядок и смежность хранилища, выделенные последовательными вызовами функции aligned_alloc, calloc, malloc и realloc не определено.
Хороший менеджер памяти сможет решить проблему. Однако существуют и другие аспекты, такие как выравнивание данных [1], которое вызывает внутреннюю фрагментацию.
Что вы могли бы сделать, если полагаетесь на встроенное управление памятью?
-
Используйте профайлер - скажем, valgrind - с опцией проверки памяти, чтобы найти память, которая не освобождается после использования.
Пример:
valgrind --leak-check=yes myprog arg1 arg2
-
Следуйте рекомендациям. Пример. В С++, если вы намерены другим наследовать свой полиморфный класс, вы можете объявить его виртуальным деструктором.
-
Используйте интеллектуальные указатели.
Примечания:
-
Внутренняя фрагментация.
-
Если вы использовали свою собственную систему управления памятью, вы можете рассмотреть Boehm-Demers-Weiser сборщик мусора.
-
Valgrind Инструментальная структура.
- Память, не освобожденная после использования, будет способствовать фрагментации.
Ответ 2
Нет, нет никакой гарантии. Согласно N1570, 7.22.3 Функции управления памятью:
Порядок и смежность хранилища, выделенные последовательными вызовами функции aligned_alloc, calloc, malloc и realloc не определено.
В любом случае у вас есть два варианта выбора:
- Полностью доверять функциям управления библиотечной памятью.
- Напишите свои собственные менеджеры памяти, если вы уверены, что действительно.
Если бы я был вами, я определенно доверял бы существующим функциям, потому что современные реализации супер умны.