Без дополнительной информации невозможно быть уверенным.
Однако мне интересно, связано ли это с фрагментацией кучи. Создав освобождая много блоков памяти, вы, вероятно, создадите целую загрузку небольших фрагментов памяти, связанных вместе. Менеджер памяти должен отслеживать их все, чтобы он мог распределить их снова, если это необходимо.
Некоторые менеджеры памяти, когда вы освобождаете блок, пытаются «объединить» его с окружающими блоками памяти, и в сильно фрагментированной куче это может быть очень медленным, так как он пытается найти окружающие блоки. Не только это, но если у вас ограниченная физическая память, она может «касаться» многих физических страниц памяти, поскольку она следует цепочке блоков памяти, что может вызвать целую массу чрезвычайно медленных сбоев страниц, которые будут очень переменными по скорости, в зависимости от точно сколько физической памяти ОС решает выделить этому процессу.
Оставляя неосвобожденную память, вы будете изменять эту схему доступа, которая может существенно повлиять на скорость. Например, вы можете заставить библиотеку времени выполнения каждый раз выделять новый блок памяти вместо того, чтобы отслеживать существующий блок подходящего размера для повторного использования.
У меня нет доказательств того, что это так в вашей программе, но я знаю, что фрагментация памяти часто является причиной медленных программ, когда выполняется много нового и свободного.