Вы должны ожидать, что сборщик Бёма будет иметь некоторые утечки памяти (потому что это консервативный GC ). Так как Boehm GC является консервативным GC, он не дает (и не может) предоставлять надежные гарантии. Но вы надеетесь, что у него не будет слишком большой утечки или потери памяти (в некоторых работах упоминается 20% -ная скорость утечки, что типично для GC от Boehm в Linux / x86-64). GC от Boehm имеет страницу о преимуществах и недостатках консервативной сборки мусора , которую вы обязательно должны прочитать. И есть также подробное описание этого, и, наконец, это свободное программное обеспечение , так что вы можете (и, возможно, должны) изучить его исходный код.
И Бём, и Вальгринд используют одинаковую технологию, поэтому они не могут хорошо играть вместе. Очевидно, что valgrind обнаружит много утечек памяти в любом коде, используя Boehm GC. Использование valgrind для кода, связывающего GC Бема, бесполезно. Вы можете явно очистить каждую зону памяти, полученную с помощью GC_MALLOC
.
Если вам нужен точный GC (в частности, если вам нужно больше гарантий о GC), выберите что-то другое или закодируйте свой собственный (наивный точный маркер и GC "стоп-мир" легко кодируются, по крайней мере, в однопотоковая программа; скучная часть - поддерживать корни GC и предоставлять доступ к вашим локальным «переменным», содержащим указатели. Вы поместите их в несколько struct
в каждом кадре вызова и соедините эти struct
вместе ). Может быть, загляните в MPS Рэйвенбрука или в мою старую, необслуживаемую и глючную Qish (возможно, это может вас вдохновить). Посмотрите также на Ocaml GC и как вам следует интерфейс C с Ocaml .
Читайте также руководство GC .
Кстати, ваш вопрос удивителен: valgrind (его инструмент memcheck ) предназначен для поиска пропущенных free
-s, и весь смысл Boehm GC состоит в том, чтобы сделать free
"бесполезным", предоставив GC_MALLOC
(замена malloc
), которая не требует каких-либо операций освобождения (поэтому нет смысла использовать valgrind в программе, выполняющей GC_MALLOC
-s).