Returning 'c_str' from a function

后端 未结 4 1508
栀梦
栀梦 2020-12-03 18:34

This is from a small library that I found online:

const char* GetHandStateBrief(const PostFlopState* state)
{
    static std::ostringstream out;

    // ...          


        
相关标签:
4条回答
  • 2020-12-03 18:52

    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.

    0 讨论(0)
  • 2020-12-03 18:53

    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.

    0 讨论(0)
  • 2020-12-03 19:05

    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.

    0 讨论(0)
  • 2020-12-03 19:11

    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();
    
    0 讨论(0)
提交回复
热议问题