[英]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.