std :: string :: c_str()和临时对象

以下C ++代码格式良好:

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()); 

我用它的问题是,创build临时std :: string对象并采取c_str()指针后,没有任何东西可以防止std :: string对象被破坏(或者我错了?)。 你可以请指点我的标准,如果代码是确定的,尽pipe一切。 它工作,当我用g ++testing。

std::string::c_str()返回的指针指向由string对象维护的内存。 在string对象上调用非const函数或string对象被破坏之前,它仍然有效。 你关心的string对象是一个临时的。 它将在完整expression式的结尾被破坏,而不是在之前和之后。 在你的情况下,完整expression式的结尾是在调用consumer ,所以你的代码是安全的。 如果consumer将指针保存在某个地方,并且希望稍后使用,则不是这样。

从C ++ 98开始,临时对象的生命周期就被严格定义了。 在此之前,它有所不同,取决于编译器,并且你编写的代码不会与g ++一起工作(1995年以前,当标准委员会投票决定时,几乎立即改变了这个)。 (也没有一个std::string ,但同样的问题影响到任何用户编写的string类。)

临时的std::string的生命周期延伸到了consumer返回的地步,所以直接从consumer直接使用该string是安全的。 不好的是存储c_str返回的值,稍后尝试使用它(临时值将被销毁,我们只能猜测你会在指针的另一端find什么)。

函数random_string_generator()返回的临时函数可以安全地用在consumer()函数中。