理解C 函數中的隱式返回
在C 中,當字串文字傳遞給函數時,編譯器會隱式地將其轉換為std::string 物件。但是,在下面的範例中,我們從 std::string 函數傳回 C 樣式字串文字:
std::string myFunction() {
return "it's me!!";
}
這造成了一個問題,因為這裡隱式呼叫的 std::string 建構子創建了字串文字的副本。當函數回傳時,這個副本應該被釋放,留下一個懸空指標。
呼叫 c_str() 時會發生什麼事?
但是,呼叫 myFunction()。 c_str() 傳回指向 std::string 物件中儲存的資料的指標。即使在 std::string 物件被釋放之後,該指標也指向保存字串文字的相同記憶體。
為什麼這有效(排序)
The該代碼似乎可以工作的原因是操作系統內存管理的一個怪癖。當記憶體區塊被釋放時,作業系統並不總是清除其內容。這意味著字串文字的資料仍然存在於記憶體中,即使它在技術上無法存取。
未定義的行為和運氣
需要注意的是,此行為是未定義的根據C標準。這意味著任何事情都可能發生,包括崩潰或不正確的結果。在某些情況下,它的工作原理不是因為正確的 C 實踐,而是因為作業系統的實作細節。
因此,避免依賴此行為並始終確保在 C 程式碼中正確分配和釋放資料至關重要.
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3