首頁 > 後端開發 > C++ > 主體

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

Patricia Arquette
發布: 2024-10-25 09:23:02
原創
674 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!