繁体   English   中英

C ++临时字符串生存期

[英]C++ temporary string lifetime

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

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());

是的,这很安全。 来自getStr的临时表达到它出现的完整表达式的末尾。该完整表达式是copyStr调用,因此必须在从getStr临时表之前返回。 这对你来说已经足够了。

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

copyStr(getStr().c_str());

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM