Crash when freeing a libraw_processd_image_i

I am using libraw in a project (Windows, Visual Studio). My program crashes, when I free the memory allocated by dcraw_make_mem_image:

libraw_processed_image_t *image = rawProcessor.dcraw_make_mem_image(&error);
free(image);

This does not occur, when I make the free-function defined in the libraw class public and use it to free the memory. What is the cause and solution to this problem?

Thank you in advance.

Forums: 

the image is allocated by

the image is allocated by 'upper level' (system) malloc, not LibRaw's one:

libraw_processed_image_t *ret = (libraw_processed_image_t*)::malloc(sizeof(libraw_processed_image_t)+ds);

So, it should be free-ed by system free(), not LibRaw::free();

Please describe your enviroment in more details.

-- Alex Tutubalin @LibRaw LLC

I also encounter this

I also encounter this problem.
In my project I link the libraw (I use Visual Studio). Everything works fine.
However if I want to free (using ::free(ptr)) the pointer returned by dcraw_make_mem_image(...) I get an exception
_CrtIsValiHeapPointer(pUserData) documented in dbgheap.c with
/*
* If this ASSERT fails, a bad pointer has been passed in. It may be
* totally bogus, or it may have been allocated from another heap.
* The pointer MUST come from the 'local' heap.
*/
_ASSERTE(_CrtIsValidHeapPointer(pUserData));

I think the problem is caused that the lib is creating the memory, so only the lib itself is allowed to free it afterwards. The application does only seem to have rights to read the memory.
If I also make the free function public in class LibRaw it seems to work, but there should be a more elegant solution ;)

Regards Tobias

Very strange problem....

The libraw_memmgr::free() is very simple, it just calls upper level ::free than forgets the pointer:

    void  free(void *ptr)
    {
        ::free(ptr);
        forget_ptr(ptr);
    }

So, if your code crashes in ::free(), it should crash in LibRaw's free() too. For pointer allocated by ::malloc() there is no difference between LibRaw::free() and ::free().

I cannot reproduce this problem in my Windows enviroment (VS2008 SP1, Win7/x64).
Could you please describe your enviroment in more detail (VS2008 patch level, Windows version, may be sample code)?

P.S. Sorry for very aggressive captcha. This is the only way to prevent forum/comments spam.
Please note, that registered/authorized users are not terrorized by captcha :)

-- Alex Tutubalin @LibRaw LLC