On Nov 25, 2013, at 5:47 PM, [email protected] wrote:
> [DllImport("libdl")]
> [return: MarshalAs(UnmanagedType.LPStr)]
> private static extern string dlerror();
You should (almost?) never use `string` (or any other reference type) as the
return type in a P/Invoke method:
http://mono-project.com/DllImport#Classes_and_Structures_as_Return_Values
> The CLI assumes that all memory that is passed between the CLI/unmanaged code
> boundary is allocated via a common memory allocator. The developer does not
> get a choice in which memory allocator is used. For managed code, the
> Marshal.AllocCoTaskMem method can be used to allocate memory,
> Marshal.FreeCoTaskMem is used to free the memory allocated by
> Marshal.AllocCoTaskMem, andMarshal.ReAllocCoTaskMem is used to resize a
> memory region originally allocated by Marshal.AllocCoTaskMem.
>
> Since classes are passed by reference, a pointer is returned, and the runtime
> assumes that it must free this memory to avoid a memory leak.
You should instead use IntPtr as the return type, then use
Marshal.PtrToStringAnsi() to convert the IntPtr into a string.
- Jon
_______________________________________________
Mono-list maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-list