Re: purify: Free memory read. in shutdown_memory_manager
| From: | Thies C. Arntzen | Date: | Wed, 03 Feb 1999 16:45:21 +0000 |
| Subject: | Re: purify: Free memory read. in shutdown_memory_manager | ||
| References: | 1 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-3860@lists.php.net to get a copy of this message | ||
hi stig,
you did that code initally.... if you have a chance - please have a quick
look...
thanx,
tc
Rasmus Lerdorf wrote:
> > but when i purify i get the attached errors (and i don't understand
> > enough about the memory manager)...
> >
> > could please somebody of the bright guys have a look (and point me into
> > the "right" direction)????
> >
> > the problem has to do with the statement struct that gets ecalloced in
> > oci8.c line 606
>
> I guess you are talking about this block:
>
> **** Purify instrumented ./php (pid 28511) ****
> FUM: Freeing unallocated memory:
> * This is occurring while in:
> free [rtlib.o]
> shutdown_memory_manager [alloc.c:357]
> php3_request_shutdown [main.c:888]
> main [main.c:1859]
> _start [crt1.o]
> * Attempting to free block at 0x2d8db8 already freed.
> * This block was allocated from:
> malloc [rtlib.o]
> _emalloc [alloc.c:129]
> _ecalloc [alloc.c:201]
> oci8_parse [oci8.c:606]
> php3_oci8_parse [oci8.c:1533]
> cs_functioncall_post_variable_passing
> [control_structures_inline.h:930]
> * There have been 1 frees since this block was freed from:
> free [rtlib.o]
> shutdown_memory_manager [alloc.c:357]
> php3_request_shutdown [main.c:888]
> main [main.c:1859]
> _start [crt1.o]
>
> What is this saying? That shutdown_memory_manager() has been called twice
> and tried to free it both times? Or is it just telling us that
> shutdown_memory_manager() was the function to free it the second time?
> If the latter, I guess it can't tell us who freed the block the first
> time? If that is the case I might suspect that one of those OCI8
> functions are trying to do a realloc() on it which would be bad news. If
> it does a realloc() and hands you back a new chunk of memory that is not
> under our control I would expect something along those lines. You
> wouldn't be able to use the PHP memory manager in that case and would have
> to do a straight malloc() and make very sure that you free the block
> yourself when you are done with it.
>
> The PHP memory manager is very simple. It just allocates a chunk of
> memory and then hands it out in smaller chunks when requested and
> maintains a linked list of these allocated blocks. If someone forgets to
> efree() a particular block, then on request shutdown it walks through the
> linked list and writes a little note in the error log informing us that
> someone didn't efree something and then it frees the entire chunk. It is
> an effective safety net which guards against memory leaks.
>
> -Rasmus
--
PHP Development Mailing List http://www.php.net/
To unsubscribe send an empty message to php-dev-unsubscribe@lists.php.net
For help: php-dev-help@lists.php.net