이 한 가지 주제에 대한 저의 독단적 인 견해로는, 적어도 광범위하게 적용되는 것을 목표로하는 어떤 도서관에서도 물리적 누출에 대한 변명이 없습니다. 그래서 GTK + 개발자가 스스로 고칠 때까지 버그를 해결하려고합니다.
라이브러리가 atexit
적어도 언로드 될 때 할당 한 메모리를 해제하기 위해 콜백을 등록하기에 충분합니다 . 조그마한 배가 많은 비용을 피하고 싶다면 처음부터 그렇게해서는 안됩니다.
아주 작은 메모리 덩어리를 한 번에 할당하려는 게으른 프로그램조차도 종료시 모든 메모리를 제거하는 간단한 순차적 할당자를 사용할 수 있습니다. 할당자가 정렬을 다루고 싶지 않다면 풀링하는 모든 청크를 최대 정렬 경계까지 채울 수 있습니다. 작은 메모리 청크를 모두 개별적으로 해제하지 않음으로써 더 빠른 종료 시간으로 이익을 얻을 수 있다면 마찬가지로 메모리를 똑바로 순차적으로 풀링하는 순차 할당자를 사용함으로써 사소한 노력 대신에 대칭 적으로 많은 이익을 얻을 수 있습니다. 보다 빠른 할당malloc
더 캐시에 친숙한 메모리 패턴으로, 라이브러리가 완료 될 때 할당 자에 의해 풀링 된 모든 연속 메모리 블록이 해제되도록합니다. 라이브러리는 다음을 수행하는 모든 자신의 교체이다 malloc
그들이 귀찮게하지 않은 전화 free
처럼 뭔가 seq_malloc
및 통화 seq_purge
에서 atexit
언로드 될 때 할당 된 모든 메모리를 해제하는 콜백을.
그렇지 않으면이 불쾌한 라이브러리가 메모리 누수 감지 도구에서 메시지를 정리하여 이제 필터링해야합니다. 더 나쁜 것은, 체계적으로 걸러 내지 않으면 자신의 애플리케이션에서 누수를 가릴 수 있고 동료가이를 간과하는 습관을 길러서 누출 탐지 툴의 유용성을 떨어 뜨릴 수 있습니다. 새는 코드 푸시. 그것은 거칠고 추악하며 무엇보다도 위의 솔루션을 사용하는 것이 얼마나 사소한 일인지에 대해 의도적으로 설득력있는 주장을 찾지 못했습니다.
논리적 누수 (가비지 수집조차도 보호 할 수없는 더 복잡한 종류)는 더 복잡한 문제이며, 할당 된 모든 메모리를 제거하는 한 수명이 짧은 프로그램에 논리적 누수가있을 수 있습니다. 논리적 유출을 피하기 위해 리소스 관리에 대해 많은 생각이 필요하기 때문에 종료됩니다 (물론 GC가있는 언어의 경우 더 그렇습니다). 그러나 나는 게으른 상황에서도 피해야 할 사소한 물리적 누출을 피할 합리적인 변명을 찾지 못했습니다.
어쨌든, 나는 최소한 valgrind에서 누출을 걸러내어 적어도 팀이 당신의 능력을 엉망으로 만들지 않도록합니다.