Зависит от того, что вы подразумеваете под «достаточным объемом доступной памяти».Для простой фрагментарной «атаки»:
Выделите 15 000 small
распределений, пока не произойдет сбой [*].
Теперь сортируйте ихв порядке адреса [**].
Свободных 100 альтернативных распределений.
Попытка выделить 100*small
байтов.
Скорее всего, распределителю не удастся найти непрерывную память для ее удовлетворения.Если он имеет размер страницы small
и много виртуального адресного пространства по сравнению с физической памятью, он может изменить положение вещей, чтобы сделать это, но для этого требуются возможности MMU поверх любой стратегии антифрагментации со стороныallocator.
Если под «достаточной доступной памятью» вы подразумеваете блок памяти large
, который раньше был непрерывным блоком, был разделен на несколько выделений, все из которых с тех пор были освобождены, а теперь - распределительобрабатывает его как отдельные блоки и поэтому не может выделить large
байтов, тогда нет, я не думаю, что вы можете заставить произвольный распределитель блоков блока потерпеть неудачу для объединения блоков.Некоторые распределители или другие могут выполнять гораздо больше работы, чем, по-видимому, выполняет Windows в этом другом вопросе, чтобы гарантировать, что смежные свободные блоки всегда объединяются.
[*] возможная проблема - чрезмерная фиксация распределителей памяти может не дать сбоя, вы просто получаете segfault или ваш процесс убит.В таких системах вам может потребоваться отслеживать объем доступной памяти.
[**] возможная проблема - в C и C ++ operator<
не гарантированно будет работать.Но почти на всех системах это так, а в C ++ тоже есть std::less
.