W mojej wprawdzie dogmatycznej opinii na ten temat nie ma usprawiedliwienia dla fizycznych wycieków, przynajmniej w żadnej bibliotece, która ma być szeroko stosowana. Chciałbym więc popsuć programistów GTK +, dopóki sami tego nie naprawią.
Jest to wystarczająco trywialne, aby biblioteka zarejestrowała atexit
wywołania zwrotne w celu zwolnienia pamięci, którą przydzieli, przynajmniej po zwolnieniu. Jeśli chce uniknąć kosztu mnóstwa drobnych przydziałów, nie powinno ich robić w ogóle.
Nawet najbardziej leniwy program, który chce tylko przydzielić mnóstwo małych kawałków pamięci na raz, mógłby użyć prostego sekwencyjnego alokatora, który po prostu usuwa całą pamięć podczas zamykania. Jeśli alokator nie chce nawet zajmować się wyrównywaniem, może po prostu uzupełnić każdą pojedynczą porcję, którą gromadzi, do maksymalnych granic wyrównywania. Jeśli byłby w stanie skorzystać z krótszych czasów wyłączania, nie uwalniając osobno wszystkich tych małych kawałków pamięci, to równie dobrze zyska symetrycznie w zamian za trywialny wysiłek, stosując taki sekwencyjny alokator, który łączy pamięć w prosty sekwencyjny sposób z znacznie szybsze alokacje niżmalloc
i bardziej przyjazne dla pamięci podręcznej wzorce pamięci, tylko po to, by wszystkie duże bloki ciągłej pamięci były pulowane przez alokator, kiedy biblioteka jest gotowa. Cała biblioteka ma do czynienia wtedy jest zastąpienie ich malloc
połączenia, dla których nie przejmuj się free
z czymś takim seq_malloc
, a rozmowy seq_purge
w atexit
zwrotnego, aby zwolnić całą pamięć przydzieloną na zwalnianego.
W przeciwnym razie ta nieprzyjemna biblioteka zaśmieca wiadomości w narzędziach do wykrywania wycieków pamięci, które musisz teraz odfiltrować. Co gorsza, jeśli nie odfiltrujesz ich systematycznie, mogą one ukryć wycieki we własnej aplikacji, a twoi koledzy mogą rozwinąć nawyk przeoczania ich, zmniejszając przede wszystkim użyteczność narzędzi do wykrywania wycieków, zapobiegając w ten sposób Twojemu zespołowi wypychanie nieszczelnego kodu. Jest to obrzydliwe i brzydkie, a przede wszystkim nie uważam, aby argumenty przemawiające za robieniem tego celowo były przekonujące, biorąc pod uwagę, jak banalne jest użycie powyższego rozwiązania.
Logiczne wycieki (bardziej złożony rodzaj, przed którym nawet zbieranie śmieci nie może się zabezpieczyć) są bardziej złożonym problemem i tam mogę znaleźć uzasadnienie dla krótkotrwałych programów mających logiczne wycieki, o ile usuwają całą pamięć, na którą przydzielają zamknięcie systemu, ponieważ wymaga wiele przemyśleń na temat zarządzania zasobami, aby uniknąć logicznych wycieków (prawdopodobnie bardziej w językach, w których występuje GC). Ale nie znajduję żadnej uzasadnionej wymówki, aby unikać fizycznych wycieków, biorąc pod uwagę, jak banalne są unikanie nawet w najbardziej leniwych kontekstach.
W każdym razie przynajmniej odfiltruję przecieki w valgrind, aby przynajmniej nie zadzierały ze zdolnością twojego zespołu do wykrycia twojego.