[Mono-list] String Marshalling for P/Invoke

Marcus mathpup@mylinuxisp.com
Wed, 8 Jan 2003 21:42:50 -0600

Jaroslaw Kowalski recently brought up the point that

"When you write 'static string function(parameters)' the function is expected
to ALLOCATE the returned string on task heap (using CoTaskMemAlloc() under
Windows), so CLR will happily free the string when it's no longer used, but
unfortunately when you return the static pointer to the CLR, it will attempt
to free an unallocated memory block, which is a big BOOM."

I'm confused about how this works under Mono under Linux (and other POSIX-like 
systems) because most libraries allocate heap storage using glibc's malloc(), 
whereas Mono uses glib's -- not glibc's -- g_free() function to return freed 
memory to the pool. I've gotten conflicting answers over whether returning 
malloc()'ed memory with g_free() is legal or not. So far, I haven't observed 
any specific problems, but as someone working on Qt#, which passes strings 
back and forth a great deal, I'm concerned about the proper behavior.

Let me be more specific: Suppose under Mono for Linux that I have

[DllImport("libpeace", CharSet=CharSet.Ansi)]
static string stringFunction();

where stringFunction returns a pointer to a string whose storage was obtained 
using malloc(). Will Mono's runtime properly dispose of the string's storage? 
If so, how? Will mono call g_free() (is that okay, since the storage was 
obtained with malloc)?