簡體   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