首頁  >  文章  >  後端開發  >  以下是一些適合問答格式並準確描述文章內容的標題選項: **選項 1(短線和直接):** * **為什麼在 Re 上呼叫 `std::string.c_str()`

以下是一些適合問答格式並準確描述文章內容的標題選項: **選項 1(短線和直接):** * **為什麼在 Re 上呼叫 `std::string.c_str()`

Patricia Arquette
Patricia Arquette原創
2024-10-25 09:23:02675瀏覽

Here are a few title options that fit the question-answer format and accurately describe the article's content:

**Option 1 (Short & Direct):**

* **Why Does Calling `std::string.c_str()` on a Returned String Lead to Undefined Behavior?** 

**Option 2 (M

為什麼在回傳字串的函數上呼叫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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn