glibc 2.28 cleanup – no more memory leaks
glibc already released 2.29, but I was still on a much older version and hadn’t noticed 2.28 (which is the version that is in RHEL8) has a really nice fix for people who obsess about memory leaks.
When running valgrind to track memory leaks you might have noticed that there are sometimes some glibc data structures left.
These are often harmless, small things that are needed during the whole lifetime of the process. So it is normally fine to not explicitly clean that up. Since the memory is reclaimed anyway when the process dies.
But when tracking memory leaks they are slightly annoying. When you want to be sure you don’t have any leaks in your program it is distracting to have to ignore and filter out some harmless leaks.
glibc already had a mechanism to help memory trackers like valgrind memcheck. If you call the secret __libc_freeres
function from the last exiting thread, glibc would dutifully free all memory. Which is what valgrind does for you (unless you want to see all the memory left and use --run-libc-freeres=no
).
But it didn’t work for memory allocated by pthreads (libpthreads.so
) or dlopen (libdl.so
). So sometimes you would still see some stray “garbage” left even if you were sure to have released all memory in your own program.
Carlos O’Donell has fixed this:
Bug 23329 – The __libc_freeres infrastructure is not properly run across DSO boundaries.
So upgrade to glibc 2.28+ and really get those memory leaks to zero!
All heap blocks were freed -- no leaks are possible