道歉,因为我知道存在类似的问题,但我还不完全清楚。以下是否安全?
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());
答案 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()