调用临时对象的方法是否安全?

时间:2009-03-31 14:43:32

标签: c++ string stl g++

我有一个函数,它将返回一个char *。由于我必须连接一些字符串,我写了以下这一行:

std::string other_text;
// ...
func(("text" + other_text).c_str());

我知道我可以避免命名我想要使用的字符串的问题。我只想借此机会提出一个更普遍的问题: 调用临时变量的方法是否安全?它符合标准吗?

4 个答案:

答案 0 :(得分:12)

调用临时变量的方法是安全的,但是不能安全地返回临时变量的char *以供以后使用。

这个char *指向一个即将被释放的缓冲区。一旦它被释放,你将有一个指向内存中无效区域的指针。

请返回std :: string对象。

答案 1 :(得分:6)

你被允许在临时对象上调用方法,但是你必须要小心对象的生命周期 - 特别是,如果你有一个函数返回c_str()调用临时std::string,那个字符串当函数返回时,对象将被销毁。

上面的代码遇到了这个问题。

答案 2 :(得分:4)

通过调用临时的c_str()返回的C字符串将一直有效,直到下次调用临时的c_str(),这种情况永远不会发生。临时本身会挂起它所属的完整表达式的结尾(return语句)。

如果你要返回一个std :: string,那么一切都将是hunkydory,因为字符串的复制构造函数将在返回时被调用以获取副本。如果你返回一个char *,那么所有的赌注都会被关闭,因为当你退出时,你要返回的值将被处理掉。这与临时没有任何关系,返回char时是一个普遍的问题 - 更喜欢返回std :: strings。

答案 3 :(得分:1)

只要临时值仍然存在,生成的指针就会很好,这通常直到表达式结束。例外情况是在初始化程序中使用临时(在这种情况下,它会持续到初始化结束),或者绑定到引用时。函数返回语句中的临时函数将持续到函数退出(除非绑定到引用)。一旦临时寿命结束,临时就会被销毁。在这种情况下,这意味着字符串析构函数运行,因此释放字符的内存。换句话说,一旦返回值,它就会被保证无效。

您可以将字符串本身传回,将其作为const引用返回。您可以将.c_str()复制到新分配的内存,然后将其传回(作为指针或智能指针)。其中任何一个都可行。

临时工的生命周期在C ++标准的第12.2节中有所介绍。根据标准,你将返回一个指向释放内存的指针。