保留臨時字串的完整性:探索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中文網其他相關文章!