首頁  >  文章  >  後端開發  >  在 C 中的臨時字串上使用 std::string::c_str() 是否安全?

在 C 中的臨時字串上使用 std::string::c_str() 是否安全?

Linda Hamilton
Linda Hamilton原創
2024-11-11 11:42:02361瀏覽

Is it Safe to Use std::string::c_str() on Temporary Strings in C  ?

在臨時字串上使用 std::string::c_str() 安全嗎?

在 C 中,std 的使用:臨時字串上的 :string::c_str() 一直是一個值得關注的主題。考慮以下程式碼片段:

void consumer(char const* p) { std::printf("%s", p); }

std::string random_string_generator();

consumer(random_string_generator().c_str());

之所以會出現這種問題,是因為在臨時std::string 物件上呼叫std::string::c_str() 時,字串物件的銷毀似乎迫在眉睫。

但是,根據C 11 標準,透過std::string::c_str() 檢索到的指標引用了字串物件管理的內存,其有效性延伸直到:

  • 在字串物件上呼叫非常量成員函數。
  • 字串物件被銷毀。

在提供的程式碼片段中,臨時字串物件在完整表達式結束時(即呼叫consumer()之後)被銷毀。因此,該程式碼被認為是安全的,因為透過 std::string::c_str() 擷取的指標在呼叫 Consumer() 的整個過程中保持有效。

自 C 98 起就明確定義了臨時物件的生命週期,與早期版本的 C 不同,它會根據編譯器而變化。因此,在早期版本中曾經不安全的程式碼現在在現代 C 編譯器中被認為是安全的。

以上是在 C 中的臨時字串上使用 std::string::c_str() 是否安全?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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