Is the following C++ code well-formed:
void consumer(char const* p)
{
std::printf("%s", p);
}
std::string random_string_generator()
{
// returns a random std::string object
}
consumer(random_string_generator().c_str());
The problem I have with it is, that after creating the temporary std::string object and taking the c_str() pointer, nothing prevents the std::string object from getting destroyed (or maybe I'm wrong?). Can you please point me to the standard, if the code is OK despite everything. It does work, when I test with g++.
The pointer returned by std::string::c_str()
points to memory
maintained by the string object. It remains valid until a non-const
function is called on the string object, or the string object is
destructed. The string object you're concerned about is a temporary.
It will be destructed at the end of the full expression, not before and
not after. In your case, the end of the full expression is after the
call to consumer
, so your code is safe. It wouldn't be if consumer
saved the pointer somewhere, with the idea of using it later.
The lifetime of temporaries has been strictly defined since C++98.
Before that, it varied, depending on the compiler, and the code you've
written wouldn't have worked with g++ (pre 1995, roughly—g++
changed this almost immediately when the standards committee voted it).
(There wasn't an std::string
then either, but the same issues affect
any user written string class.)
The temporary std::string
's lifetime extends just beyond the point where consumer
returns, so it is safe to use anything on that string directly from within consumer
. What is not OK is to store the value that c_str
returns and try to use it later (the temporary will have been destroyed, and we can only guess what you will find at the other end of the pointer).
The temporary returned by the function random_string_generator() can be used in consumer() function safely.
c_str()
const char*
in a subsequent statement (still inside the function, but outside the first statement)? Would this bring us a dangling pointer - Alex Gidan 2019-02-20 16:04