This is from a small library that I found online:
const char* GetHandStateBrief(const PostFlopState* state)
{
static std::ostringstream out;
// ... rest of the function ...
return out.str().c_str()
}
In my code I am doing this:
const char *d = GetHandStateBrief(&post);
std::cout<< d << std::endl;
Now, at first d
contained garbage. I then realized that the C string I am getting from the function is destroyed when the function returns because std::ostringstream
is allocated on the stack. So I added:
return strdup( out.str().c_str());
And now I can get the text I need from the function.
I have two questions:
Am I understanding this correctly?
I later noticed that
out
(of typestd::ostringstream
) was allocated with static storage. Doesn't that mean that the object is supposed to stay in memory until the program terminates? And if so, then why can't the string be accessed?
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 returnstd::string
.The static storage of
out
doesn't help, because.str()
returns a temporarystd::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
, variableout
does not need to be static. You need an explicitstatic string
to replace the temporary that was being created in your original call toout.str()
:You're right that
out
is a static variable allocated on the data segment. Butout.str()
is a temporary allocated on the stack. So when you doreturn 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.