Na minha opinião dogmática sobre esse assunto, não há desculpas para vazamentos físicos, pelo menos em qualquer biblioteca que pretenda ser amplamente aplicável. Então, eu procuraria incomodar os desenvolvedores do GTK + até que eles próprios consertassem.
É trivial o suficiente para uma biblioteca registrar atexit
retornos de chamada para liberar qualquer memória alocada pelo menos ao ser descarregada. Se quiser evitar a despesa de um barco cheio de alocações pequeninas, não deveria fazê-las em primeiro lugar.
Mesmo o programa mais preguiçoso que apenas deseja alocar um monte de pequenos pedaços de memória de uma só vez pode usar um alocador sequencial direto que apenas elimina toda a memória no desligamento. Se o alocador nem quiser lidar com o alinhamento, ele poderá preencher cada pedaço único que ele agrupa até os limites máximos de alinhamento. Se ele foi capaz de se beneficiar com tempos de desligamento mais rápidos, não liberando todos esses pequenos pedaços de memória individualmente, também se beneficia bastante simetricamente em troca de um esforço trivial, usando um alocador sequencial que agrupa a memória de maneira sequencial direta com alocações muito mais rápidas quemalloc
e padrões de memória mais amigáveis ao cache, apenas para liberar todos os grandes blocos de memória contígua agrupados pelo alocador quando a biblioteca estiver concluída. Tudo o que a biblioteca precisa fazer é substituir suas malloc
chamadas pelas quais elas não se importam free
com algo assim seq_malloc
e chamar seq_purge
um atexit
retorno de chamada para liberar toda a memória alocada após o descarregamento.
Caso contrário, você terá essa biblioteca desagradável repleta de mensagens em suas ferramentas de detecção de vazamento de memória, agora você precisa filtrar. Pior, se você não filtrá-los sistematicamente, eles podem obscurecer os vazamentos em seu próprio aplicativo e seus colegas podem desenvolver o hábito de ignorá-los, reduzindo a utilidade das ferramentas de detecção de vazamentos em primeiro lugar para impedir que sua própria equipe empurrando código com vazamento. É grosseiro e feio e, acima de tudo, não acho os argumentos a favor de fazê-lo deliberadamente serem convincentes, dado o quão trivial é usar a solução acima.
Vazamentos lógicos (o tipo mais complexo que nem a coleta de lixo pode proteger) são uma questão mais complexa, e lá encontrei uma justificativa para que programas de curta duração tenham vazamentos lógicos, desde que purgem toda a memória que alocaram em desligamento, pois requer muita reflexão sobre o gerenciamento de recursos para evitar vazamentos lógicos (sem dúvida mais nos idiomas que possuem GC). Mas não encontro nenhuma desculpa razoável para evitar vazamentos físicos, dada a trivialidade de evitar mesmo nos contextos mais preguiçosos.
De qualquer forma, pelo menos eu filtraria os vazamentos em valgrind para que eles pelo menos não mexessem na capacidade da sua equipe de detectar a sua.