Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Usage of string::c_str on temporary string [duplicate]

In regards to when temporary objects get destroyed, is this valid:

FILE *f = fopen (std::string ("my_path").c_str (), "r");

Will the temporary be destroyed immediately after having evaluated the first argument to fopen or after the fopen call.

Testing with the following code:

#include <cstdio>
using namespace std;
struct A {
        ~A() { printf ("~A\n"); }
        const char *c_str () { return "c_str"; }
};
void foo (const char *s) { printf ("%s\n", s); }
int main () {
        foo (A().c_str());
        printf ("after\n");
        return 0;
}

gives:

c_str
~A
after

which indicates that the whole statement is first evaluated, and then any temporaries are destroyed. Is this ordering mandated by the standard or implementation-specific?

like image 336
Irfy Avatar asked Mar 03 '14 12:03

Irfy


1 Answers

The temporary will be destroyed at the end of the expression, namely the ; semicolon. So you are safe.

§ 12.2 ... Temporary objects are destroyed as the last step in evaluating the full-expression (1.9) that (lexically) contains the point where they were created. This is true even if that evaluation ends in throwing an exception.

like image 156
mockinterface Avatar answered Sep 22 '22 06:09

mockinterface