在臨時字串上使用 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中文網其他相關文章!