in reply to Re: C++ strings, references and XS (char*)
in thread C++ strings, references and XS
I thought about doing that, the problem is that I don't know how would that affect memory handling. I mean, If I'd had a function like this in C++:
string bleh(void);
I could easily have a C wrapper that would do:
const char* blehC(void) { return bleh(void).c_str(); }
But... this has a big problem: you are returning a pointer to a local variable (the returned string inside blehC is local to blehC).
So, what I would need is to tell XS/perl/whatever to give me a piece of memory that it considers a scalar where I can write to (wether it is a scalar being returned or a reference to a scalar which I receive). I guess that I don't have an alternative to write something in the CODE: section, but I really wouldn't know how to do that nor how the C/C++ function should look like. I mean, in C I don't have references, so I would be taking a char*, but... how do I know how much space do I have to write? When I write to a std::string I'm indirectly allocating memory and returning to something a user gave me. So, at C level, how does XS/perl/whatever knows how to free the memory I return? assuming that I do something like this:
(ignoring possible fencepost errors)char* respondC(const char* input, const char* username) { char* ret = NULL; if (respond(input, username, cpp_ret)) { string cpp_ret; ret = new char[cpp_ret.length()+1]; strncpy(ret, cpp_ret.c_str(), cpp_ret.length()); } return ret; }
So, that is what is haunting me... Maybe there's a way to not even write at CODE: but just write a C function that takes a scalar reference (SV* or something like that) where I can copy (as a string) the result of the C++ function. Anyway, that would be ideal, not sure if possible.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^3: C++ strings, references and XS (char*)
by tye (Sage) on Dec 20, 2005 at 16:31 UTC | |
by v01d (Novice) on Dec 20, 2005 at 21:58 UTC |