libc exit() does not cleanup such objects
The kernel recycles the memory cleanly, so doing so is not really
valuable.
being strict about such memory at termination might find some
minor latent bugs, but the software ecosystem is so vast a
full-system-audit/review/cleanup before enabling it by default
would likely cost 20,000 man-hours (or more)
> OpenBSD nasu.my.domain 6.2 GENERIC.MP#238 amd64.
>
> The following trivial program:
>
> #include <stdio.h>
>
> int
> main(int argc, char *argv[])
> {
> printf("Hello, world!\n");
> return 0;
> }
>
> Gives the following malloc.out output when run with MALLOC_OPTIONS=D:
>
> ******** Start dump testes *******
> MT=0 I=1 F=0 U=0 J=1 R=0 X=0 C=0 cache=64 G=0
> Malloc dir of testes pool 0 at 0x7b935db0050
> Region slots free 511/512
> Finds 0/0
> Inserts 1/0
> Deletes 0/0
> Cheap reallocs 0/0
> In use 77824
> Guarded 0
> Free chunk structs:
> Free pages cached: 0
> slot) hash d type page f size [free/n]
> 8e) # 8e 0 pages 0x7b9f1391000 0x7b70b611bd7 65536
> Leak report
> f sum # avg
> 0x7b70b611bd7 65536 1 65536
>
> ******** End dump testes *******
>
> When fclose(stdout) is added before the return, the leak disappears, so
> I guess libc either doesn't free its own (lazily allocated?) FILE*s, or
> MALLOC_OPTIONS=D dumps its stats before it is done. Closing
> stdin/stdout/stderr probably shouldn't be required of a program to be
> leak-free?
>