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