On Tuesday, 3 December 2013 at 12:31:16 UTC, John Colvin wrote:
On Tuesday, 3 December 2013 at 10:57:51 UTC, Chris wrote:
I have a C module that dynamically allocates memory for a string like so:

char *result = (char*)malloc(length + 1); // 'length' has been calculated

When I call it from D (via extern (C)), is it ok to free it from there like so:

void callFunction() {
 auto result = callToCFunction(); // Returns above *result
 // ...
 std.c.stdlib.free(result);
}

The problem is that, as it is now, *result is allocated in a different place in the C module (not in "callToCFunction()) and cannot be freed before D has called it.

If D cannot free it in this way, I'll have a serious memory leak and I'll have to rewrite the existing C module (which is probably better given the awkward situation above).

You should be fine to free in that way as long as you haven't done anything crazy like separately static linking libc.

core.stdc.stdlib; is the correct module to use, std.c.* only exist for backwards compatibility.

Ok. Thanks for the answer. std.c.stdlib.free() is mentioned on the "How to interface to C" page (http://dlang.org/interfaceToC.html). So maybe that needs an update.

Reply via email to