為什麼在回傳字串的函數上呼叫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; // Outputs garbage }</code>
直觀上,人們會期望從getString() 傳回的臨時字串在main() 的範圍內保持有效。然而,這是不正確的。
問題在於 C 中臨時物件的生命週期。臨時物件在創建它的表達式結束時被銷毀,除非它綁定到引用或用於初始化命名物件。在這種情況下,getString() 傳回一個臨時字串,該字串在 main() 中的表達式末尾被銷毀。
因此,cStr 持有一個懸空指針,使用它可能會導致未定義的行為。為了避免這個問題,可以使用命名變數或參考來確保傳回字串的有效性。例如:
<code class="cpp">std::string returnedString = getString(); const char* cStr = returnedString.c_str(); std::cout << cStr << std::endl; // Safe</code>
或者,可以直接使用臨時字串而不將其指派給變數:
<code class="cpp">std::cout << getString().c_str() << std::endl; // Also safe</code>
以上是以下是一些適合問答格式並準確描述文章內容的標題選項: **選項 1(短線和直接):** * **為什麼在 Re 上呼叫 `std::string.c_str()`的詳細內容。更多資訊請關注PHP中文網其他相關文章!