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

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

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

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

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

用malloc申請的內(nèi)存,沒有釋放,為什么程序也不會(huì)出錯(cuò)?

最近有好幾位同學(xué)提出了這個(gè)問題。

講到C語言指針的時(shí)候,我們都會(huì)反復(fù)強(qiáng)調(diào),malloc申請的堆內(nèi)存,用完后一定要用free釋放掉,否則光申請不釋放,內(nèi)存就會(huì)變的越來越少,這種現(xiàn)象就叫做內(nèi)存泄漏。

泄漏到一定程度,沒有內(nèi)存可用,程序可能就會(huì)奔潰。

很多同學(xué)在寫代碼的時(shí)候,經(jīng)常忘記釋放內(nèi)存,比如這段代碼:

#include


void test()
{
chat*s=(char*)malloc(sizeof(char)*1024 * 1024);
}


int main()
{
    test();
    
    return 0;
}

申請了1M堆內(nèi)存,在程序的任何地方都沒有釋放。

運(yùn)行程序后,一切正常,而且即使運(yùn)行了很多遍,系統(tǒng)也沒有問題。

要解釋這個(gè)問題,就不得不提操作系統(tǒng)的內(nèi)存管理。

不管是在 Linux 還是 Windows 下寫代碼,我們用的內(nèi)存都是虛擬內(nèi)存。

以 32 位 Linux 為例,每個(gè)進(jìn)程啟動(dòng)的時(shí)候,系統(tǒng)都會(huì)給他分配4個(gè)G的虛擬內(nèi)存空間,分為用戶態(tài)和內(nèi)核態(tài),用戶態(tài)又分成了堆、棧、數(shù)據(jù)段、代碼段等等。

wKgZomVxIzuAdXqNAAiQ2d76vq4801.jpg

由于不同的進(jìn)程使用的虛擬地址空間不同,所以即使程序出現(xiàn)了段錯(cuò)誤,也就是進(jìn)程本身異常退出,并不會(huì)影響其他程序的運(yùn)行。

程序里面用malloc申請的就是堆空間這一段,如果程序一直在運(yùn)行不會(huì)結(jié)束,并且一直在申請沒有釋放,那過一段時(shí)間后程序確實(shí)會(huì)奔潰。

但是我們學(xué)習(xí)的時(shí)候,更多的是一些測試程序,運(yùn)行一下程序就結(jié)束。進(jìn)程一旦結(jié)束,系統(tǒng)就會(huì)回收這段虛擬內(nèi)存空間,對整個(gè)系統(tǒng)或者其他程序也不會(huì)產(chǎn)生什么影響。

平時(shí)寫一些測試程序,還是應(yīng)該養(yǎng)成釋放的習(xí)慣,放在大型項(xiàng)目中,內(nèi)存泄漏既有危害又難排查。

最后,給大家留一個(gè)問題,申請的堆內(nèi)存,需要用free來釋放,那同一塊內(nèi)存用free釋放兩次有沒有問題?

這個(gè)問題在學(xué)習(xí)的時(shí)候也是經(jīng)常遇到,如果你在Linux下做開發(fā),這個(gè)現(xiàn)象就是釋放兩次出現(xiàn)的:

wKgaomVxIzqAR84QAAHCstAd15U794.jpg

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


審核編輯:湯梓紅

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

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136860
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3787

    瀏覽量

    81057
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    480

    瀏覽量

    70564
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68625
  • 內(nèi)存泄漏
    +關(guān)注

    關(guān)注

    0

    文章

    39

    瀏覽量

    9218

原文標(biāo)題:內(nèi)存泄漏有什么影響

文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

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

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

    錯(cuò)誤910:進(jìn)程內(nèi)存不足

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    記錄一個(gè)關(guān)于線程內(nèi)存泄漏問題的定位過程,以及過程中的收獲。 1. 初步定位 是否存在內(nèi)存泄漏:想到內(nèi)存
    的頭像 發(fā)表于 11-13 11:38 ?619次閱讀
    線程<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)存泄漏是計(jì)算機(jī)科學(xué)中常見的問題,在開發(fā)和
    的頭像 發(fā)表于 12-19 14:10 ?2797次閱讀

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

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

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

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