std :: string :: c_str()和temporaries

时间:2012-04-04 07:44:35

标签: c++ stl stdstring

以下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 ++进行测试时,它确实有效。

3 个答案:

答案 0 :(得分:67)

std::string::c_str()返回的指针指向内存 由字符串对象维护。它一直有效,直到非常量 函数在字符串对象上调用,或者字符串对象是 自毁。您关注的字符串对象是临时的。 它将在完整表达结束时被破坏,而不是在和之前 不是之后。在你的情况下,完整表达式的结尾是在 致电consumer,以便您的代码安全无虞。如果consumer则不会 将指针保存在某个地方,以便以后使用它。

自C ++ 98以来,临时工作的生命周期已经严格定义。 在此之前,它根据编译器和您的代码而变化 写的不适用于g ++(1995年之前,大概是g ++ 当标准委员会投票时,几乎立即改变了这一点)。 (那时也没有std::string,但同样的问题会影响 任何用户编写的字符串类。)

答案 1 :(得分:19)

临时std::string的生命周期延伸到consumer返回的范围之外,因此可以直接在consumer 上的任何内容>。什么是确定是存储c_str返回的值并稍后尝试使用它(临时将被销毁,我们只能猜测你会在另一端找到什么指针)。

答案 2 :(得分:5)

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