0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

內(nèi)存泄漏有什么影響

學(xué)益得智能硬件 ? 來源:學(xué)益得智能硬件 ? 2023-12-07 09:42 ? 次閱讀

用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)存,比如這段代碼:

#include


void 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ù)段、代碼段等等。

wKgZomVxIzuAdXqNAAiQ2d76vq4801.jpg

由于不同的進程使用的虛擬地址空間不同,所以即使程序出現(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)的:

wKgaomVxIzqAR84QAAHCstAd15U794.jpg

如果往上翻的話,還能看到double free字樣,所以,同樣的一塊堆內(nèi)存,只能釋放一次。


審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 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)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Linux內(nèi)存泄漏檢測實現(xiàn)原理與實現(xiàn)

    在使用沒有垃圾回收的語言時(如 C/C++),可能由于忘記釋放內(nèi)存而導(dǎo)致內(nèi)存被耗盡,這叫 內(nèi)存泄漏。由于內(nèi)核也需要自己管理內(nèi)存,所以也可能出
    發(fā)表于 12-09 11:11 ?955次閱讀

    錯誤910:進程內(nèi)存不足

    REAL>錯誤引腳泄漏內(nèi)存泄漏多大?它是每個錯誤幾k,還是它取決于錯誤的類型?如果它是一個小的內(nèi)存
    發(fā)表于 10-15 07:52

    C++內(nèi)存泄漏

    C++內(nèi)存分配與釋放均由用戶代碼自行控制,靈活的機制有如潘多拉之盒,即讓程序員了更廣的發(fā)揮空間,也產(chǎn)生了代代相傳的內(nèi)存泄漏問題。對于新手來說,最常
    發(fā)表于 09-15 17:39 ?16次下載

    內(nèi)存泄漏的特點和類型

    內(nèi)存的控制,因而造成了內(nèi)存的浪費。內(nèi)存泄漏與許多其他問題有著相似的癥狀,并且通常情況下只能由那些可以獲得程序源代碼的程序員才可以分析出來。然而,
    的頭像 發(fā)表于 06-20 10:58 ?2777次閱讀

    內(nèi)存泄漏問題原理及檢視方法

    可能不少開發(fā)者都遇到過內(nèi)存泄漏導(dǎo)致的網(wǎng)上問題,具體表現(xiàn)為單板在現(xiàn)網(wǎng)運行數(shù)月以后,因為內(nèi)存耗盡而導(dǎo)致單板復(fù)位現(xiàn)象。一方面,內(nèi)存泄漏問題屬于比較
    的頭像 發(fā)表于 10-10 10:42 ?2499次閱讀

    如何使用ThreadLocal來避免內(nèi)存泄漏

    本次給大家介紹重要的工具ThreadLocal。講解內(nèi)容如下,同時介紹什么場景下發(fā)生內(nèi)存泄漏,如何復(fù)現(xiàn)內(nèi)存泄漏,如何正確使用它來避免內(nèi)存
    的頭像 發(fā)表于 08-20 09:29 ?4189次閱讀
    如何使用ThreadLocal來避免<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>

    【openssl】從openssl的常用接口淺談【內(nèi)存泄漏

    使用openssl內(nèi)存泄露風險嗎?從openssl的常用接口調(diào)用淺談【內(nèi)存泄漏】的風險和規(guī)避。
    的頭像 發(fā)表于 08-31 11:24 ?3000次閱讀
    【openssl】從openssl的常用接口淺談【<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>】

    什么是內(nèi)存泄漏?內(nèi)存泄漏哪些現(xiàn)象

    內(nèi)存泄漏幾乎是很難避免的,不管是老手還是新手,都存在這個問題,甚至 Windows 與 Linux 這類系統(tǒng)軟件也或多或少存在著內(nèi)存泄漏。
    的頭像 發(fā)表于 09-05 17:24 ?9578次閱讀

    什么是內(nèi)存泄漏?如何避免JavaScript內(nèi)存泄漏

    JavaScript 代碼中常見的內(nèi)存泄漏的常見來源: 研究內(nèi)存泄漏問題就相當于尋找符合垃圾回收機制的編程方式,有效避免對象引用的問題。
    發(fā)表于 10-27 11:30 ?350次閱讀
    什么是<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>

    內(nèi)存泄漏如何避免

    的數(shù),那就是內(nèi)存溢出。 2. 內(nèi)存泄漏 內(nèi)存泄露 memory leak,是指程序在申請內(nèi)存后,無法釋放已申請的
    的頭像 發(fā)表于 11-10 11:04 ?692次閱讀
    <b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>如何避免

    內(nèi)存泄漏會產(chǎn)生哪些后果

    內(nèi)存泄漏原因 內(nèi)存泄漏在C/C++這種不帶GC(Garbage Collection)的語言里,是一個經(jīng)常發(fā)生的問題。因為沒有GC,所以分配的內(nèi)存
    的頭像 發(fā)表于 11-10 15:06 ?751次閱讀
    <b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>會產(chǎn)生哪些后果

    線程內(nèi)存泄漏問題的定位

    記錄一個關(guān)于線程內(nèi)存泄漏問題的定位過程,以及過程中的收獲。 1. 初步定位 是否存在內(nèi)存泄漏:想到內(nèi)存
    的頭像 發(fā)表于 11-13 11:38 ?571次閱讀
    線程<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>問題的定位

    內(nèi)存溢出與內(nèi)存泄漏:定義、區(qū)別與解決方案

    內(nèi)存溢出與內(nèi)存泄漏:定義、區(qū)別與解決方案? 內(nèi)存溢出和內(nèi)存泄漏是計算機科學(xué)中常見的問題,在開發(fā)和
    的頭像 發(fā)表于 12-19 14:10 ?2340次閱讀

    C語言內(nèi)存泄漏問題原理

    內(nèi)存泄漏問題只有在使用堆內(nèi)存的時候才會出現(xiàn),棧內(nèi)存不存在內(nèi)存泄漏問題,因為棧
    發(fā)表于 03-19 11:38 ?443次閱讀
    C語言<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>問題原理

    如何檢測內(nèi)存泄漏

    檢測內(nèi)存泄漏是軟件開發(fā)過程中一項至關(guān)重要的任務(wù),它有助于識別和解決那些導(dǎo)致程序占用過多內(nèi)存資源,從而影響程序性能甚至導(dǎo)致程序崩潰的問題。以下將詳細闡述幾種常見的內(nèi)存
    的頭像 發(fā)表于 07-30 11:50 ?1338次閱讀