Во-первых, я согласен с другими авторами, которые предложили утечку ресурсов. Вы действительно хотите сначала это исключить.
Надеемся, что менеджер кучи, который вы используете в настоящее время, имеет способ вывести фактическое общее свободное пространство, доступное в куче (по всем свободным блокам), а также общее количество блоков, которые он разделил над. Если средний размер свободного блока относительно мал по сравнению с общим свободным пространством в куче, то у вас есть проблема фрагментации. В качестве альтернативы, если вы можете сбросить размер наибольшего свободного блока и сравнить его с общим свободным пространством, то это будет сделано то же самое. Самый большой свободный блок будет маленьким по отношению к общему количеству свободного пространства, доступного во всех блоках, если вы столкнетесь с фрагментацией.
Чтобы быть очень ясным в вышесказанном, во всех случаях речь идет о свободных блоках в куче, а не о выделенных блоках в куче. В любом случае, если вышеуказанные условия не выполняются, то у вас do какая-то ситуация утечки.
Итак, как только вы исключили утечку, вы можете рассмотреть возможность использования лучшего распределителя. malloc Дуга Ли , предложенный в вопросе, является очень хорошим распределителем для приложений общего назначения и очень устойчивым большинство времени. Иными словами, это было проверено временем, чтобы работать очень хорошо для большинства приложений. Однако ни один алгоритм не является идеальным для всех приложений, и любой подход к алгоритму управления может быть нарушен правильными патологическими условиями в сравнении с его конструкцией.
Почему у вас возникает проблема фрагментации? - Источники проблем фрагментации вызваны поведением приложения и связаны с сильно различающимися временами выделения в одной и той же области памяти , То есть некоторые объекты распределяются и освобождаются регулярно, в то время как другие типы объектов сохраняются в течение длительных периодов времени в одной и той же куче. Думайте о объектах с более длительным сроком службы, как о прокалывании дыр в больших областях арены и, тем самым, предотвращении объединение смежных блоков, которые были освобождены.
Чтобы решить проблему такого типа, лучшее, что вы можете сделать, - это логически разделить кучу на вспомогательные области, где время жизни более сходно. По сути, вам нужна временная куча и постоянная куча или кучи, которые группируют вещи с одинаковым временем жизни.
Некоторые другие предложили другой подход для решения проблемы, который заключается в попытке сделать размеры распределения более похожими или идентичными, но это менее идеальный вариант, поскольку он создает другой тип фрагментации, называемый внутренней фрагментацией, - который фактически является потраченным впустую. пространство, которое у вас есть, выделяя в блоке больше памяти, чем вам нужно.
Кроме того, при наличии хорошего распределителя кучи, такого как у Дуга Ли, делать размеры блоков более схожими не нужно, поскольку распределитель уже будет использовать схему разбиения по размерам на два размера, что сделает ненужным искусственное регулирование передаваемых размеров распределения. to malloc () - по сути, его менеджер кучи делает это для вас автоматически гораздо надежнее, чем приложение сможет внести коррективы.