1 回答

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊
請問一下free是不是將標(biāo)記為已使用的地址改為未使用,也就是里面的數(shù)據(jù)并未清空,只是改了下“標(biāo)記”?
你說的這些是在猜測 free 的具體實(shí)現(xiàn)。 C 標(biāo)準(zhǔn)沒有規(guī)定 free 具體實(shí)現(xiàn)應(yīng)該如何,所以這個(gè)問題沒有標(biāo)準(zhǔn)答案。
C 標(biāo)準(zhǔn)只是規(guī)定:
free 的參數(shù)必須是之前由庫函數(shù)分配內(nèi)存而來的指針,或是 null 指針
參數(shù)如果之前被 free 了,則函數(shù)的行為是未定義的
訪問已被 free 的指針的行為是未定義的
當(dāng)然,你的猜測也是有道理的。確實(shí)很多實(shí)現(xiàn)是這樣的。
也許你的這些思考對你學(xué)習(xí)理解 C 語言有幫助。但是在學(xué)習(xí)和使用 C 語言時(shí)要記?。耗悴粦?yīng)該假定你的編譯器會如何實(shí)現(xiàn),只應(yīng)該按照規(guī)定的語法規(guī)則來使用 C。
還有個(gè)問題就是用malloc創(chuàng)建一個(gè)在子函數(shù)中的數(shù)組,這個(gè)數(shù)組是動態(tài)存儲類型嗎,是不是自動存儲類型(動態(tài)與自動的關(guān)系是什么?)?
是你說的“動態(tài)存儲類型”的。其實(shí)就是指需要動態(tài)管理的內(nèi)存(用 malloc 分配、free 釋放...等)。
那當(dāng)然就不是“自動存儲類型”的了。你通常定義的普通變量一般都屬于這種“自動類型”,這樣的變量所占用的內(nèi)存只在它所在的作用域中存在,離開其作用域后就會被銷毀。
這兩種存儲類型的區(qū)別簡單地說就是這樣的。
所以才會強(qiáng)調(diào)說“手動分配的內(nèi)存一定要記得 free 掉,不然就會內(nèi)存泄漏”,就是因?yàn)檫@些所謂“動態(tài)存儲類型”并不會被自動銷毀。
- 1 回答
- 0 關(guān)注
- 934 瀏覽
添加回答
舉報(bào)