Фрагментация памяти

Когда я использую 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 не определено.

В любом случае у вас есть два варианта выбора:

  • Полностью доверять функциям управления библиотечной памятью.
  • Напишите свои собственные менеджеры памяти, если вы уверены, что действительно.

Если бы я был вами, я определенно доверял бы существующим функциям, потому что современные реализации супер умны.