首頁  >  文章  >  後端開發  >  為什麼將 stringstream.str().c_str() 指派給 const char* 會導致懸空指針,如何解決這個問題?

為什麼將 stringstream.str().c_str() 指派給 const char* 會導致懸空指針,如何解決這個問題?

Linda Hamilton
Linda Hamilton原創
2024-11-22 07:17:14177瀏覽

Why does assigning `stringstream.str().c_str()` to a `const char*` lead to a dangling pointer, and how can this issue be resolved?

理解Stringstream、String 和char* 轉換

程式設計中常見的困惑涉及stringstream、string 和char 之間的互動 轉換。本文旨在闡明從stringstream.str().c_str() 返回的字串駐留在記憶體中的位置以及為什麼它不能直接分配給const char.

當使用stringstream 時,str ( ) 函數傳回一個臨時字串對象,該對象僅存在於呼叫它的表達式中。該字串物件通常在堆疊上創建,並在表達式結束後被銷毀。

讓我們檢查提供的程式碼範例:

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

using namespace std;

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。由於傳回的字串是臨時的,因此在表達式結束後它會被銷毀,從而使 cstr2 指向懸空指標。因此,列印 cstr2 會導致垃圾。

解決問題:

為了避免這個問題,我們可以將臨時字串複製到永久字串物件並取得其C 風格字串或將臨時字串綁定到const 引用,延長其生命週期:

// Copy to a permanent string
const std::string tmp = stringstream.str();
const char* cstr = tmp.c_str();

// Bind to a const reference
{
  const std::string&amp; tmp = stringstream.str();   
  const char* cstr = tmp.c_str();
}

在修改後的程式碼範例中,兩者cstr 和cstr2 指向在const字串物件的生命週期中存在的有效 C 風格字串。因此,兩個字串都可以正確列印。

需要注意的是,通常首選將臨時字串綁定到 const 引用,因為它可以避免不必要的複製,並提供更有效率、更簡潔的解決方案。

以上是為什麼將 stringstream.str().c_str() 指派給 const char* 會導致懸空指針,如何解決這個問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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