std::string::c_str()和临时变量

std::string::c_str() and temporaries

本文关键字:变量 str string std      更新时间:2023-10-16

以下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::字符串对象被破坏(或者我错了?)。如果代码在任何情况下都可以,你能给我指一下标准吗。当我用g++测试时,它确实有效。

std::string::c_str()返回的指针指向内存由字符串对象维护。它保持有效,直到出现非常数函数是在字符串对象上调用的,或者字符串对象是已销毁。您关心的字符串对象是临时的。它将在完整表达式结束时被销毁,而不是在和之前而不是之后。在您的情况下,完整表达式的末尾位于调用consumer,因此您的代码是安全的。如果consumer将指针保存在某个位置,以便以后使用。

从C++98开始,临时存储器的使用寿命就得到了严格的定义。在此之前,它会有所不同,这取决于编译器和您所使用的代码written不会与g++一起工作(1995年以前,大致为++当标准委员会投票表决时,几乎立即改变了这一点)。(当时也没有std::string,但同样的问题影响任何用户编写的字符串类。)

临时std::string的生存期刚好超过consumer返回的点,因此可以安全地直接从consumer中使用该字符串上的任何内容。可以的是存储c_str返回的值,并在以后尝试使用它(临时的将被销毁,我们只能猜测您在指针的另一端会找到什么)。

函数random_string_generator()返回的temporary可以安全地用于consumer()函数。