用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 為例,每個進(jìn)程啟動的時候,系統(tǒng)都會給他分配4個G的虛擬內(nèi)存空間,分為用戶態(tài)和內(nèi)核態(tài),用戶態(tài)又分成了堆、棧、數(shù)據(jù)段、代碼段等等。
由于不同的進(jìn)程使用的虛擬地址空間不同,所以即使程序出現(xiàn)了段錯誤,也就是進(jìn)程本身異常退出,并不會影響其他程序的運行。
程序里面用malloc申請的就是堆空間這一段,如果程序一直在運行不會結(jié)束,并且一直在申請沒有釋放,那過一段時間后程序確實會奔潰。
但是我們學(xué)習(xí)的時候,更多的是一些測試程序,運行一下程序就結(jié)束。進(jìn)程一旦結(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文章
7614瀏覽量
137709 -
程序
+關(guān)注
關(guān)注
117文章
3795瀏覽量
81406 -
指針
+關(guān)注
關(guān)注
1文章
481瀏覽量
70608 -
代碼
+關(guān)注
關(guān)注
30文章
4825瀏覽量
69043 -
內(nèi)存泄漏
+關(guān)注
關(guān)注
0文章
39瀏覽量
9235
原文標(biāo)題:內(nèi)存泄漏有什么影響
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
Linux內(nèi)存泄漏檢測實現(xiàn)原理與實現(xiàn)
錯誤910:進(jìn)程內(nèi)存不足
C++內(nèi)存泄漏
內(nèi)存泄漏的特點和類型
內(nèi)存泄漏問題原理及檢視方法
如何使用ThreadLocal來避免內(nèi)存泄漏
![如何使用ThreadLocal來避免<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>](https://file.elecfans.com/web2/M00/10/DC/pYYBAGEfBqGAGjWZAAAtOrXVEPA461.png)
【openssl】從openssl的常用接口淺談【內(nèi)存泄漏】
![【openssl】從openssl的常用接口淺談【<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>】](https://file.elecfans.com//web2/M00/66/20/poYBAGMO1IeAIExZAAEcoWkuCOk815.png)
什么是內(nèi)存泄漏?內(nèi)存泄漏有哪些現(xiàn)象
什么是內(nèi)存泄漏?如何避免JavaScript內(nèi)存泄漏
![什么是<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>?如何避免JavaScript<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>](https://file1.elecfans.com/web2/M00/AC/63/wKgZomU7L22AZ-ElAAA0BwIEV8Q974.png)
內(nèi)存泄漏會產(chǎn)生哪些后果
![<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>會產(chǎn)生哪些后果](https://file1.elecfans.com/web2/M00/AF/48/wKgZomVN1lOAdhMlAAGc9pGMEIM217.jpg)
內(nèi)存溢出與內(nèi)存泄漏:定義、區(qū)別與解決方案
C語言內(nèi)存泄漏問題原理
![C語言<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>問題原理](https://file1.elecfans.com/web2/M00/C4/F2/wKgZomX5CPGAHxynAAAdVE956KA826.png)
評論