in reply to Re^2: [Win32] "Free to wrong pool ..." error
in thread [Win32] "Free to wrong pool ..." error
The problem seems only to arise when it's the external library that allocates the memory.
That's (probably) because the external library is calling the C-runtime malloc(), but the XS code is calling the XS header redefined free() instead of the C-runtime one.
If you call malloc() from within XS code, that is also redefined to use a Perl header wrapper which means the perl malloc is called and it allocates the memory from it's internal pools (and probably tags it). So when you then call free() (the redefined version), it can check the tags (or cross reference the address or however it determines that it is "freeing from the wrong pool"), and everything matches up, so no message.
But when the memory was allocated in an external library (by the C-runtime), and you then attempt to free it from your XS code, the Perl memory management routines have no record of the address you are trying to free (as it didn't allocate it), so it issues the warning.
One possible answer is to create your own free() (just to confuse matters further:), and place it at the end of your XS/Inline C code. And #undef free before you call it. Something like:
// Your inline C stuff here ... // where you currently call free() call MyFree() MyFree( p ); ... void MyFree( void *p ) { #undef free free( p ); } //EOF
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: [Win32] "Free to wrong pool ..." error
by syphilis (Archbishop) on Feb 10, 2009 at 05:45 UTC | |
by ikegami (Patriarch) on Feb 10, 2009 at 06:25 UTC | |
by BrowserUk (Patriarch) on Feb 10, 2009 at 14:39 UTC |