This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Help debugging basic_string<char>



On 23 Jan 2006, at 14:06, Neil Bird wrote:


Around about 23/01/06 09:16, Jamie Kirkpatrick typed ...
std::string getString();
void f()
{
    const char* p = getString().c_str();
    // use p
}

Ok - this is what I meant. So what im seeing is correct OK, thats good I guess! Is there something in the c++ spec i can point people too to indicate that this is the case? An out of interest - how come the destructor on string is not getting called so soon?

Nothing specific, it's more about understanding what's happening. getString is returning a transient std::string which will only live for the duration of the statement. You're calling .c_str() on this, and that's fine. But at the end of the statement (after the assignment) the string goes out of scope, its destructor is called and the memory opinted to by the c_str() is invalid.


You have two alternatives; if getString() is accessing a long term store you can guarantee will be around, you can make it return a reference, maybe even a const ref. (which would be better), so you're not accessing the transient but the original.

Alternatively, keep a copy yourself:

const std::string& getString();
void f()
{
    const char* p = getString().c_str();
    // use p
}

or

std::string getString();
void f()
{
    const std::string s = getString;
    const char* p = s().c_str();
    // use p
}


Great - thats a nice concise explanation.



Also, is it ok to assume that the following is valid?
int test( char * buffer );
main()
{
int result = test( someFunctionReturningString().c_str () ); // buffer valid for duration of subsequent call?
}

Yes; in this case the transient string is valid till after 'test' returns. The specs. probably got something to say about the lifetime of objects created on the stack for function calls.

Good - I had hoped as much.....




Can't help with the rest as I've not done that sort of thing.

Shame - im getting an extremely difficult to track down memory error now - double free in the destructor for basic_string<> :/


anyone fancy a go!? :p

Thanks

Jamie


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]