今天看到有mallc後沒有free的例子,就覺得是不是main函數執行完也自動回收?後來問了一些人,回答中有說不會,有說看操作系統,有點迷

突然想到平時做OJ碰到建樹使用new 但後面沒有delete,是不是會發生內存泄露?


主函數結束後,進程結束,該進程的所有內存被操作系統回收,當然包括malloc申請到的那些內存。

但這不代表你寫了malloc就不用寫free,這是一個非常糟糕的習慣,每個malloc都必須要有對應的free


main函數退出,就沒你的事了……

你說操作系統要不要回收?

就算不回收,放著佔據內存空間?

那你關閉程序的意義何在?

所以,正常的系統都會自動回收……(我不排除特例)


內存屬於進程,進程不存在內存也就不在了。


如果主函數執行完畢,那麼程序相當於結束了。系統是會把佔用的內存釋放的,但是問題在於你用malloc一定要有free的習慣。因為你不釋放,那塊空間在主函數沒結束運行前一直存在。增加了計算機消耗,你malloc的空間小還好。要是在循環中,次數大了,將會嚴重影響計算機性能和執行效率。


作為C程序員,內存分配了要釋放,時刻記住你不是C#和java,有個土豪的爹後邊收集,我們C程序員都是自己當家,對油米貴有切身體,鋼要用到刀刃上,你可能永遠體會不到,為什麼一個位元組我還分八瓣.為什麼明明是鏈表,為什麼用數組實現,為什麼明明看上去應該使用Map卻使用數組、其是我不是摳門,我只是愛你愛的太深.


對於競賽而言,操心「main函數執行完」之後的事情作甚?跟你半點關係都沒有。

既然你好奇,下面回答你

【是不是main函數執行完也自動回收?】

是。


會的。程序關閉以後操作系統會回收其佔用的所有資源。不然程序小白寫的代碼會把系統佔滿,就必須要重啟電腦了。


首先寫出答案:會

但這裡引出一個新的問題:加入調用者不是main函數怎麼辦?

試想一下你寫了一個模塊:包含malloc操作,載入於一個長時間運行的程序中(比如資料庫)

你malloc了很多空間,也完成了目標操作,但模塊不再被使用了以後,程序並沒有退出,仍然處於運行狀態。此時由於模塊沒有再被使用,指向那些內存的指針不見了,於是這些內存就不在能被訪問了。但由於系統不會認為這些內存是無用的,所以也不會回收這些內存,那麼內存泄露(memory leak)就出現了。

這就是為什麼即使程序運行正確也一定要寫上free或delete的原因

如果你認為寫delete太麻煩,可以用以下的函數模板:(此處只給出delete數組的操作,有興趣可以推理一下delete單個指針和new的操作)

template&
void SafeDeleteArray(T* t){
if(t){
delete[] t;
t = NULL;
}
}


C語言必須free,否則會發生內存泄露。確實有時候會出現malloc後不free也能運行,那是因為你的程序佔用內存少,程序結束也就沒關係了,但是注意那樣風險很大,當你申請的內存太大會造成難以想像的問題,所以,建議養成寫malloc就寫free的習慣,這樣比較安全。


應用程序會,驅動不會


進程結束以後會回收,但是應該養成free並讓指針置NULL的好習慣


程序結束會收回,但是好些程序,例如系統程序,是會長時間運行的,如果不主動釋放,會造成內存不足,程序崩壞


會自動釋放,但這並不是一個良好的習慣,new一定要對應delete。沒有delete/free的內存會一直存在到程序結束或被釋放。只申請不釋放最後可能就會MLE。


在C語言中寫程序,有malloc,也必須有相應的free,C語言完全信任程序員,由程序員全權負責內存的動態分配和釋放。每一個程序員都應當自覺承擔起這個任務。無論在Windows平台還是Unix/Linux/BSD平台,如果只申請了內存而沒有釋放,那麼在程序運行期間該內存就會一直被佔用,在多任務環境下特別是長年運行的服務程序,這樣的問題就非常嚴重了。

在Windows平台,如果程序沒有自己釋放已申請的內存就結束了,影響不大,Windows操作系統會自動回收給該程序的全部內存空間。但在Unix/Linux/BSD平台下,操作系統也沒有辦法回收這部分內存,在下次系統重新啟動之前,這部分內存就是永遠無法再使用了,術語是內存泄露。問題就會相當嚴重。


修改回答

c語言malloc之後最好使用free進行釋放。具有回收功能的操作系統會回收你申請的資源。


推薦閱讀:
相关文章