是公形成下面的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());
我与它的问题是,创建临时的std :: string对象,并采取c_str()指针后,没有什么可以阻止的std :: string对象从被破坏掉(或者也许我错了吗?)。 可否请您指出我的标准,如果代码不顾一切正常。 它不工作,当我与G试验++。
由返回的指针std::string::c_str()
指向由字符串对象维持存储器。 它仍然有效,直到一个非const函数被调用字符串对象或字符串对象被破坏。 你担心的字符串对象是暂时的。 这将在充分表达年底前不和不是之后遭到破坏。 在你的情况下,充分表达的到底是调用后consumer
,所以你的代码是安全的。 它不会是,如果consumer
的地方保存的指针,与后来的使用它的想法。
临时对象的寿命自C ++ 98被严格地定义。 在此之前,它多种多样的,这取决于编译器,和你写的代码不会相克合作++(1995年之前,大致-G ++几乎立刻改变了这个时候标准委员会投票的话)。 (有没有一个std::string
然后要么,但同样的问题影响任何用户编写的字符串类。)
临时std::string
的寿命延长刚刚超越的地步, consumer
的回报,所以它是安全的,该字符串直接从内使用任何consumer
。 什么是不正常是存储该值c_str
回报,稍后再尝试使用它(临时将被摧毁,我们只能猜测你会发现什么在指针的另一端)。
由函数random_string_generator()返回的临时可以在消费()函数安全地使用。