為什麼在回傳字串的函數上呼叫std::string.c_str() 可能會導致問題
處理字串時C 、了解臨時物件的生命週期至關重要。在按值傳回字串的函數的回傳值上呼叫 std::string.c_str() 時,會出現一個常見的誤解。
在以下程式碼片段中:
<code class="cpp">std::string getString() { std::string str("hello"); return str; } int main() { const char* cStr = getString().c_str(); std::cout << cStr << std::endl; }</code>
一可能期望函數getString() 將傳回儲存在函數作用域內的字串str 的副本,從而允許cStr 保存對其的有效引用。
但是,情況並非如此。在 C 中,函數呼叫的回傳值是一個臨時物件。當臨時物件綁定到引用或用於初始化命名物件時,其生命週期會延長。否則,它會在創建它的完整表達式末尾被銷毀。
在上面的程式碼中,getString()的回傳值是一個std::string類型的臨時對象,它被傳回以價值為基礎。由於 cStr 不綁定到引用或初始化命名對象,因此在計算表達式 getString() 後,臨時 std::string 物件將被銷毀。這意味著 cStr 現在指向已釋放的內存,使其使用不安全。
要避免此問題,請考慮透過將臨時物件複製到命名物件或將其綁定到引用來延長臨時物件的生命週期,例如:
<code class="cpp">std::string str = getString(); const char* cStr = str.c_str();</code>
或:
<code class="cpp">const std::string& ref = getString(); const char* cStr = ref.c_str();</code>
或者,您可以立即使用c_str() 返回的指針,而不將其儲存在變數中:
<code class="cpp">std::cout << getString().c_str() << std::endl;</code>
以上是為什麼在按值返回字串的函數上呼叫'std::string.c_str()”會導致問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!