Is the following C++ code well-formed:
void consumer(char const* p)
{
std::printf(\"%s\", p);
}
std::string random_string_generator()
{
// returns a ran
The temporary returned by the function random_string_generator() can be used in consumer() function safely.
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).