This is from a small library that I found online:
const char* GetHandStateBrief(const PostFlopState* state)
{
static std::ostringstream out;
// ...
You're right that out
is a static variable allocated on the data segment. But out.str()
is a temporary allocated on the stack. So when you do return out.str().c_str()
you're returning a pointer to a stack temporary's internal data. Note that even if a string is not a stack variable, c_str
is "only granted to remain unchanged until the next call to a non-constant member function of the string object."
I think you've hit on a reasonable workaround, assuming you can't just return a string.
strdup allocates a copy of the string on the heap, which you have to free manually later (with free()
I think). If you have the option, it would be much better to return std::string
.
The static storage of out
doesn't help, because .str()
returns a temporary std::string
, which is destroyed when the function exits.
strdup() returns a char* pointer that is pointing to memory on the heap. You need to free() it when you're done with it, but yes, that will work.
The static local variable std::ostringstream out
makes no sense in this case, unless the std::string being returned was also static which your observation is showing to be not true.
In GetHandStateBrief
, variable out
does not need to be static. You need an explicit static string
to replace the temporary that was being created in your original call to out.str()
:
static std::string outStr;
std::ostringstream out;
... rest of function ...
outStr = out.str();
return outStr.c_str();