用malloc申請的內(nèi)存,沒有釋放,為什么程序也不會出錯?
最近有好幾位同學(xué)提出了這個問題。
講到C語言指針的時候,我們都會反復(fù)強調(diào),malloc申請的堆內(nèi)存,用完后一定要用free釋放掉,否則光申請不釋放,內(nèi)存就會變的越來越少,這種現(xiàn)象就叫做內(nèi)存泄漏。
泄漏到一定程度,沒有內(nèi)存可用,程序可能就會奔潰。
很多同學(xué)在寫代碼的時候,經(jīng)常忘記釋放內(nèi)存,比如這段代碼:
#includevoid test() { chat*s=(char*)malloc(sizeof(char)*1024 * 1024); } int main() { test(); return 0; }
申請了1M堆內(nèi)存,在程序的任何地方都沒有釋放。
運行程序后,一切正常,而且即使運行了很多遍,系統(tǒng)也沒有問題。
要解釋這個問題,就不得不提操作系統(tǒng)的內(nèi)存管理。
不管是在 Linux 還是 Windows 下寫代碼,我們用的內(nèi)存都是虛擬內(nèi)存。
以 32 位 Linux 為例,每個進程啟動的時候,系統(tǒng)都會給他分配4個G的虛擬內(nèi)存空間,分為用戶態(tài)和內(nèi)核態(tài),用戶態(tài)又分成了堆、棧、數(shù)據(jù)段、代碼段等等。
由于不同的進程使用的虛擬地址空間不同,所以即使程序出現(xiàn)了段錯誤,也就是進程本身異常退出,并不會影響其他程序的運行。
程序里面用malloc申請的就是堆空間這一段,如果程序一直在運行不會結(jié)束,并且一直在申請沒有釋放,那過一段時間后程序確實會奔潰。
但是我們學(xué)習(xí)的時候,更多的是一些測試程序,運行一下程序就結(jié)束。進程一旦結(jié)束,系統(tǒng)就會回收這段虛擬內(nèi)存空間,對整個系統(tǒng)或者其他程序也不會產(chǎn)生什么影響。
平時寫一些測試程序,還是應(yīng)該養(yǎng)成釋放的習(xí)慣,放在大型項目中,內(nèi)存泄漏既有危害又難排查。
最后,給大家留一個問題,申請的堆內(nèi)存,需要用free來釋放,那同一塊內(nèi)存用free釋放兩次有沒有問題?
這個問題在學(xué)習(xí)的時候也是經(jīng)常遇到,如果你在Linux下做開發(fā),這個現(xiàn)象就是釋放兩次出現(xiàn)的:
如果往上翻的話,還能看到double free字樣,所以,同樣的一塊堆內(nèi)存,只能釋放一次。
審核編輯:湯梓紅
-
C語言
+關(guān)注
關(guān)注
180文章
7594瀏覽量
135857 -
程序
+關(guān)注
關(guān)注
116文章
3756瀏覽量
80751 -
指針
+關(guān)注
關(guān)注
1文章
478瀏覽量
70491 -
代碼
+關(guān)注
關(guān)注
30文章
4722瀏覽量
68231 -
內(nèi)存泄漏
+關(guān)注
關(guān)注
0文章
39瀏覽量
9193
原文標題:內(nèi)存泄漏有什么影響
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論