首頁 >後端開發 >C++ >在 C 中將 `std::string::c_str()` 與臨時字串一起使用安全嗎?

在 C 中將 `std::string::c_str()` 與臨時字串一起使用安全嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-13 14:09:02933瀏覽

Is Using `std::string::c_str()` with a Temporary String Safe 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 物件在擷取其後可能會被破壞c_str() 指標。根據 C 標準,這是否會帶來有效性問題?

答案:

了解臨時物件的生命週期至關重要。在 C 中,臨時變數在完整表達式結束時被銷毀,而不是在創建後或使用前立即銷毀。因此,在給定的程式碼中,臨時 std::string 物件將持續存在,直到對 Consumer() 的函數呼叫結束。

透過 std::string::c_str() 取得的指標保持有效,直到對字串物件執行任何非常量操作,否則該物件將被破壞。由於字串物件是臨時的,並且在完整表達式的末尾被破壞,因此程式碼確實格式良好且有效。

歷史註腳:

重要的是請注意,上述行為在 C 98 中已標準化。在此之前,臨時變數的生命週期因編譯器實作而異。然而,隨著標準的成熟,行為得到了統一定義,確保了編譯器之間的一致性。

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

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