以下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 ++进行测试时,它确实有效。
答案 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()函数。