C ++临时字符串生存期

时间:2014-06-30 10:32:54

标签: c++ string temporary

道歉,因为我知道存在类似的问题,但我还不完全清楚。以下是否安全?

void copyStr(const char* s)
{
    strcpy(otherVar, s);
}

std::string getStr()
{
    return "foo";
}

main()
{
    copyStr(getStr().c_str());
}

一个临时的std :: string将存储来自getStr()的返回值,但是它会活得足够长,以便我可以将其C字符串复制到别处吗?或者我必须明确地保留一个变量,例如

std::string temp = getStr();
copyStr(temp.c_str());

3 个答案:

答案 0 :(得分:4)

是的,这很安全。临时从getStr生效到它出现的完整表达式的结尾。该完整表达式是copyStr调用,因此它必须在临时从getStr被销毁之前返回。这对你来说绰绰有余。

答案 1 :(得分:2)

临时变量一直存在,直到完整表达式结束。所以,在你的例子中,

copyStr(getStr().c_str());

getStr()的返回值将一直有效,直到copyStr结束。因此,在copyStr内访问其值是安全的。当然,您的代码可能仍然不安全,因为它不会测试缓冲区是否足以容纳字符串。

答案 2 :(得分:0)

您必须声明一个临时变量并为其分配返回结果:

...
{
  std::string tmp = getStr();
  //tmp live
  ...
}
//tmp dead
...

临时var必须具有名称,并且将存在于声明它的范围内。

编辑:它是安全的,你通过复制的值传递它(你的编辑很重,并且我的上述答案无效。上面的答案与第一次修订有关)

copyStr(getStr().c_str());会将rvalue传递给copyStr()