Date: Tue, 28 Jan 2003 17:40:12 -0800 (PST) From: David Schultz <dschultz@uclink.Berkeley.EDU> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/47599: Memory leak on stdout Message-ID: <200301290140.h0T1eCnF074837@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/47599; it has been noted by GNATS. From: David Schultz <dschultz@uclink.Berkeley.EDU> To: Sean Farley <sean-freebsd@farley.org> Cc: FreeBSD-gnats-submit@FreeBSD.ORG Subject: Re: bin/47599: Memory leak on stdout Date: Tue, 28 Jan 2003 17:39:41 -0800 Thus spake Sean Farley <sean-freebsd@farley.org>: > On Tue, 28 Jan 2003, David Schultz wrote: > > > Thus spake Sean C. Farley <sean-freebsd@farley.org>: > > > When testing an application for memory leaks, I noticed one that > > > I could not get rid of. I happened to be allocated from > > > /usr/src/lib/libc/stdio/makebuf.c on line 72, but only when > > > printf() (or really any function) used stdout. Adding an > > > fclose(stdout) to the end of my application fixed the memory > > > leak. > > > > > > I realize this is not much of a leak, but I thought it would be > > > nice to have it either documented or fixed before others run > > > into this confusing leak. > > > > I don't think it's a bug that libc lazily allocates memory for the > > three standard file descriptors. I think you should consider this a > > false positive from dmalloc. > > Do you mean lazily deallocates memory? I think the allocation is > perfectly fine. I was just wondering if there is a point at which libc > was supposed to free the memory before exit. A hook similar to > atexit()? No, it lazily allocates a buffer for each output stream the first time that stream is used. It frees the buffer when the file is closed, which is usually never, in the case of the standard three file descriptors. In a practical sense, freeing that memory is pointless extra work because you need it until the program terminates anyway. If you just want to appease dmalloc, you could probably hack something up, but it would be harder than you think. You can't just special case the standard file descriptors and give them static buffers, because then setbuf(3) would cause a *real* memory leak. Adding an atexit hook might work, but you have a chicken-and-egg problem. Your hook to free up to three measely 1K buffers would have to be last, because other atexit routines would expect stdio to work. But dmalloc uses an atexit hook to look for memory leaks, so you'd have to run your atexit handler before dmalloc's. But dmalloc uses stdio... To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200301290140.h0T1eCnF074837>