首頁 >後端開發 >C++ >為什麼 `stringstream.str().c_str()` 會導致 C 記憶體錯誤?

為什麼 `stringstream.str().c_str()` 會導致 C 記憶體錯誤?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-15 05:01:021042瀏覽

Why Does `stringstream.str().c_str()` Cause a Memory Error in C  ?

stringstream、string 和char 之間的轉換混淆*

轉換從stringstream.str() 取得的字串時會出現此問題。 c_str() 轉換為 const char*。了解返回字串的記憶體管理和生命週期對於避免潛在錯誤至關重要。

程式碼片段示範了這個問題:

#include <string>
#include <sstream>
#include <iostream>

int main()
{
    stringstream ss("this is a string\n");

    string str(ss.str());

    const char* cstr1 = str.c_str();

    const char* cstr2 = ss.str().c_str();

    cout << cstr1   // Prints correctly
        << cstr2;   // ERROR, prints out garbage

    system("PAUSE");

    return 0;
}

假設 stringstream.str().c_str( ) 可以指派給 const char* 是不正確的。這會導致 cstr2 印出垃圾的錯誤。

了解記憶體管理

stringstream.str() 傳回一個臨時字串對象,該物件僅在結束之前有效當前表達式的。當表達式完成時,臨時物件被銷毀,指向其資料的指標(由 c_str() 傳回)變得無效。

解決錯誤

解決這個問題,臨時字串物件必須儲存在單獨的變數中,例如:

const std::string tmp = stringstream.str();
const char* cstr2 = tmp.c_str();

透過將暫時物件儲存在tmp 中,可以延長指標的生命週期,並且列印cstr2 現在可以正常工作。

獎勵積分說明

修改後的程式碼區塊中:

cout << cstr           // Prints correctly
    << ss.str().c_str() // Prints correctly
    << cstr2;           // Prints correctly (???)

所有列印語句現在都可以正常運作,因為:

  • cstr 和cstr2どちらも有效な文字列ポインタです。
  • ss.str().c_str() 是一個臨時字串,綁定到 const 引用,延長其生命週期。

以上是為什麼 `stringstream.str().c_str()` 會導致 C 記憶體錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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