[Mono-devel-list] reading char * from extern function

Marcus mathpup at mylinuxisp.com
Fri May 23 20:28:23 EDT 2003


When calling into existing libraries, it is not feasible to alter the source 
code to change their memory-management policies.

If I create "QObject* obj", then "name = obj->callName()" will return a "const 
char*".  At this point, it is not permissible to call "free(name)".

If I compile and run the following, valgrind reports errors:

#include <qobject.h>
#include <iostream>

using namespace std;

int main()
{
    QObject* obj = new QObject( 0, "myObject" );
    char* name = (char*) obj-> className();
   free(name);
}


==1494== Invalid free() / delete / delete[]
==1494==    at 0x4004083A: free (vg_clientfuncs.c:180)
==1494==    by 0x804879E: main (in /home/marcus/a.out)
==1494==    by 0x40A7D991: __libc_start_main (in /lib/libc.so.6)
==1494==    by 0x8048661: _Znwj@@GLIBCPP_3.2 (in /home/marcus/a.out)
==1494==    Address 0x409154C8 is not stack'd, malloc'd or free'd
==1494==
==1494== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 1 from 1)
==1494== malloc/free: in use at exit: 5764 bytes in 379 blocks.
==1494== malloc/free: 397 allocs, 20 frees, 6169 bytes allocated.


On Friday 23 May 2003 1:53 am, you wrote:

> Well, thats true. Functions should simply duplicate the string before
> they return if needed. Else you have a memory leak which is impossible
> to avoid.




More information about the Mono-devel-list mailing list