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

為什麼在函數傳回的已釋放 `std::string` 上呼叫 `c_str()` 看似有效,但實際上會導致未定義的行為?

Susan Sarandon
發布: 2024-10-26 04:16:02
原創
928 人瀏覽過

Why Does Calling `c_str()` on a Deallocated `std::string` Returned from a Function Seem to Work, But Actually Leads to Undefined Behavior?

為什麼從std::string 函數傳回C 字串文字並呼叫c_str() 可能會導致未定義的行為

在最近在的講座中,您可能遇到過引發一些混亂的C 程式碼片段:

<code class="cpp">std::string myFunction() { return "it's me!!"; }

int main() {
  const char* tempString = myFunction().c_str();
  char myNewString[100] = "Who is it?? - ";
  strcat(myNewString, tempString);
  printf("The string: %s", myNewString);
}</code>
登入後複製

假設此程式碼會失敗是可以理解的,因為「return 'it's me!!'」隱式呼叫了std::string 建構子帶有const char[]。因此,當函數傳回時,從函數傳回的 std::string 會立即被釋放。然而,令人驚訝的是,程式碼執行時沒有任何明顯問題。

您對程式碼的分析是準確的。這裡所展示的行為屬於未定義行為。在這種情況下,影響可能會大不相同。在這個特定的實例中,為字串分配的內存,即使在技術上已被釋放,在訪問時仍然保留其原始資料。這種現象經常發生,因為作業系統不會自動清除已釋放的內存,而是選擇將其標記為可供將來使用。

但是,值得注意的是,處理記憶體釋放不是 C 的責任語言;這是特定於每個作業系統實現的複雜細節。從 C 的角度來看,包羅萬象的「未定義行為」適用。因此,強烈建議不要依賴此類行為,因為它可能會導致程式碼中出現不可預測且可能是災難性的結果。

以上是為什麼在函數傳回的已釋放 `std::string` 上呼叫 `c_str()` 看似有效,但實際上會導致未定義的行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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