По моему общепризнанному догматическому мнению по этому вопросу, нет никаких оправданий физическим утечкам, по крайней мере, в любой библиотеке, которая стремится быть широко применимой. Так что я буду стремиться к ошибкам разработчиков GTK +, пока они сами не исправят это.
Для библиотеки достаточно просто зарегистрировать atexit
обратные вызовы, чтобы освободить любую память, которую она выделяет, по крайней мере, после выгрузки. Если он хочет избежать расходов на малюсенькие ассигнования, он не должен делать их в первую очередь.
Даже самая ленивая программа, которая просто хочет выделить кучу маленьких кусочков памяти, может использовать простой последовательный распределитель, который просто удаляет всю память при завершении работы. Если распределитель даже не хочет иметь дело с выравниванием, он может просто заполнить каждый отдельный кусок, который он объединяет, до максимальных границ выравнивания. Если бы он смог выиграть с более быстрым временем выключения, не освобождая все эти крошечные куски памяти по отдельности, он также выиграет симметрично в обмен на тривиальные усилия, используя такой последовательный распределитель, который объединяет память в прямом последовательном режиме с гораздо быстрее, чем распределениеmalloc
и более дружественные к кешу шаблоны памяти, только чтобы все большие блоки непрерывной памяти, объединенные распределителем, были освобождены, когда библиотека будет готова. Вся библиотека должна сделать, это заменить их malloc
вызовы , на которые они не удосужились free
что - то вроде seq_malloc
, и вызов seq_purge
в функции atexit
обратного вызова , чтобы освободить всю память , выделенную при выгрузке.
В противном случае вы получите эту грязную библиотеку, загромождающую сообщения в ваших инструментах обнаружения утечек памяти, которые вы теперь должны отфильтровать. Хуже того, если вы не будете систематически отфильтровывать их, они могут скрыть утечки в вашем собственном приложении, и у ваших коллег может развиться привычка игнорировать их, что снизит полезность инструментов обнаружения утечек, в первую очередь, в предотвращении вашей собственной команды толкая негерметичный код. Это грубо и безобразно, и больше всего я не нахожу аргументы в пользу того, чтобы делать это намеренно, было бы убедительным, учитывая, насколько тривиально использовать вышеуказанное решение.
Логические утечки (более сложный вид, от которого не может защитить даже сборка мусора) - более сложная проблема, и там я мог бы найти какое-то оправдание для недолговечных программ иметь логические утечки, если они очищают всю память, выделенную для них. завершение работы, так как для избежания логических утечек необходимо много думать об управлении ресурсами (возможно, в большей степени в языках с GC). Но я не нахожу разумного оправдания, чтобы избежать физических утечек, учитывая, насколько банально их избегать даже в самых ленивых ситуациях.
Во всяком случае, по крайней мере, я бы отфильтровал утечки в Valgrind, чтобы они, по крайней мере, не мешали способности вашей команды определять вашу собственную.