在C 中,從std::string 函數傳回C 字串文字是不明智的做法可能會導致不確定的行為。然而,一個常見的誤解是這段程式碼應該會失敗,儘管它在某些情況下似乎可以運作。
當「是我!!」傳遞給 myFunction() 時,C 字串文字會隱式轉換為 std::string 物件。傳回的 std::string 物件指向其內部字元緩衝區,其中包含字串文字的副本。在 std::string 上呼叫 c_str() 將傳回指向此緩衝區的指標。
出現潛在問題是因為 std::string 物件的內部字元緩衝區未儲存在靜態記憶體中。一旦 myFunction() 函數傳回,std::string 物件及其內部緩衝區就會被銷毀。這意味著從 c_str() 獲得的指標成為指向已釋放記憶體的懸空指標。
但是,在某些實作和某些情況下,作業系統可能不會立即回收 std::string 所使用的記憶體。這稱為記憶持久性。結果,作業系統錯誤地允許程式碼繼續存取已釋放的內存,給人一種程式碼工作正常的錯覺。
需要強調的是,這種行為在 C 中未定義。語言標準沒有定義在這種情況下會發生什麼,並且不同的實現可能表現不同。依賴記憶體持久性是危險的,可能會在不同的上下文或不同的作業系統上導致意外錯誤。
因此,雖然範例程式碼在某些情況下似乎可以工作,但它仍然被認為是未定義的行為,應該被避免了。為了防止此類問題,建議從 std::string 函數傳回字串文字的副本,而不是直接指向其內部緩衝區的指標。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3