首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ string::c_str() 返回值深度解析:臨時指針與生命週期陷阱

     編輯:程式設計疑難解答

兩大核心問題

  1. 「c_str 返回臨時指針,不能對其操作」是什麼意思?
  2. 調用 c_str 後 string 會被析構嗎?

問題一:const char* 與不可修改性

`c_str()` 返回 `const char*`,指向 string 內部緩衝區(以 `\0` 結尾)。

  • 不能修改內容:`const` 禁止通過該指針寫入,如 `strcpy(ptr, "abc")` 編譯報錯。
  • 非拷貝:返回的是內部緩衝區地址,非臨時拷貝,無額外開銷。

問題二:指針生命週期綁定 string 對象

string 不會因調用 c_str 而析構。string 的析構由其作用域決定(如局部變量離開作用域、delete、vector 清空等)。

危險場景:指針存活期超過 string 對象:

const char* dangerous() {
    std::string s = "1234";
    return s.c_str(); // 錯誤!s 即將析構,返回指針懸空
}

函數返回時 `s` 析構,內部緩衝區釋放,返回指針指向無效內存。雖可能短期內未被覆蓋而「偶然」能讀,但屬未定義行為,極其危險。

安全使用模式

  1. 即用即取:`printf("%s", str.c_str());` 指針僅在表達式內存活。
  2. 複製內容:需長期保存時 `std::string copy = str;` 或 `char* buf = strdup(str.c_str());`(記得 free)。
  3. 確保 string 活得比指針久:如類成員 `std::string m_str; const char* get() { return m_str.c_str(); }` 只要對象存在指針有效。

C++17 补充:data() 非 const 版本

C++17 `string::data()` 返回非 const 指針,允許修改內部緩衝區(但不可改變長度),`c_str()` 仍保持 const 語義。

總結

`c_str()` 返回內部緩衝區只讀指針,生命週期綁定 string 對象。切勿讓指針逃逸出 string 作用域,需長期用請拷貝。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved