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

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

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

不停的malloc程序會(huì)異常嗎

學(xué)益得智能硬件 ? 來(lái)源:學(xué)益得智能硬件 ? 2025-01-14 09:17 ? 次閱讀

把 malloc 放在死循環(huán)里面,會(huì)是什么樣的現(xiàn)象?

比如這樣的代碼,每次使用 malloc 申請(qǐng) 1M 大小的內(nèi)存,其他什么操作也不做。

理論上來(lái)說(shuō),堆內(nèi)存是有限的,如果不停的申請(qǐng),遲早內(nèi)存會(huì)被用完,程序應(yīng)該會(huì)異常退出。

于是我找了個(gè)環(huán)境,把程序運(yùn)行起來(lái)試下。

先用虛擬機(jī),跑的一個(gè) 32 位的紅帽系統(tǒng),程序運(yùn)行起來(lái),好像只是一個(gè)普通的死循環(huán),半天也沒(méi)見(jiàn)他退出,而且程序也不卡頓。

看下進(jìn)程的內(nèi)存使用情況,數(shù)值一直都沒(méi)變。

應(yīng)該可以得出結(jié)論,雖然不停的申請(qǐng),但是因?yàn)閮?nèi)存沒(méi)有使用,所以系統(tǒng)并沒(méi)有真正的分配。

修改下代碼,申請(qǐng)了內(nèi)存后,使用 memset 把內(nèi)存初始化一下,再次運(yùn)行,不一會(huì)虛擬機(jī)卡頓,直到程序被殺死。

換個(gè)環(huán)境,這次使用 64 位的Ubuntu,同樣的代碼,沒(méi)有初始化內(nèi)存,運(yùn)行程序,很快進(jìn)程就被殺死。

運(yùn)行的時(shí)候看了下內(nèi)存的使用情況,確實(shí)是在快速的增長(zhǎng)。

所以在這個(gè)環(huán)境里面,即使申請(qǐng)的堆內(nèi)存沒(méi)有使用,系統(tǒng)也確實(shí)給分配了。

同樣是 malloc 函數(shù),不同的操作系統(tǒng),內(nèi)存管理的策略也不太一樣。

#include 
#include 


int main()
{
    char *p = NULL;


    while (1) 
    {   
        p = (char *)malloc(1);


        *p = 1;
    }   


    return 0;
}

最后給大家看個(gè)筆試題,也是關(guān)于 malloc 函數(shù),運(yùn)行程序,應(yīng)該是個(gè)怎樣的現(xiàn)象?如果你能看出來(lái),歡迎在評(píng)論區(qū)交流。

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

    關(guān)注

    117

    文章

    3795

    瀏覽量

    81328
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4345

    瀏覽量

    62901
  • malloc
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    75

原文標(biāo)題:不停的malloc,程序會(huì)不會(huì)異常

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ADS1230輸出數(shù)據(jù)會(huì)不定時(shí)出現(xiàn)一個(gè)異常數(shù)據(jù),怎么回事?

    我們現(xiàn)在在使用ADS1230芯片。在使用過(guò)程中一直沒(méi)什么問(wèn)題。最新一批產(chǎn)品出現(xiàn)了,輸出數(shù)據(jù)會(huì)不定時(shí)出現(xiàn)一個(gè)異常數(shù)據(jù)的問(wèn)題。換了原來(lái)的ADS1230芯片后正常。 我們抓波形發(fā)現(xiàn),這些異常數(shù)據(jù)出現(xiàn)后
    發(fā)表于 11-26 07:25

    TPA3220功放的OTW_CLIP管腳會(huì)異常拉低,為什么?

    當(dāng)功放的功率達(dá)到120W時(shí),TPA3220功放的OTW_CLIP管腳會(huì)異常拉低。 正常情況下FAULT和OTW_CLIP管腳均為高電平,如圖為FAULT和OTW_CLIP管腳的真值表圖, 圖為異常時(shí)抓取的波形:
    發(fā)表于 09-29 09:04

    stm32單片機(jī)燒錄程序會(huì)擦除原來(lái)的程序

    在STM32單片機(jī)燒錄程序的過(guò)程中, 通常情況下會(huì)擦除原來(lái)的程序 ,并將新程序寫(xiě)入單片機(jī)的閃存(Flash)中。這一過(guò)程是通過(guò)燒錄工具(如ST-Link、J-Link等)實(shí)現(xiàn)的,它們負(fù)
    的頭像 發(fā)表于 09-02 09:42 ?2464次閱讀

    plc突然斷電會(huì)導(dǎo)致什么異常

    PLC(Programmable Logic Controller,可編程邏輯控制器)是一種廣泛應(yīng)用于工業(yè)自動(dòng)化領(lǐng)域的控制器。當(dāng)PLC突然斷電時(shí),可能會(huì)導(dǎo)致一些異常情況,這些異常情況可能
    的頭像 發(fā)表于 07-25 10:11 ?1640次閱讀

    普通普普通雙電源切換開(kāi)關(guān)ATS無(wú)法保證敏感負(fù)載晃電時(shí)不停機(jī)該怎么辦?

    GTS系列雙電源高速切換開(kāi)關(guān)快速雙電源采用常用電源、備用電源、輸出電壓電流動(dòng)態(tài)監(jiān)控技術(shù)(幅值、相位、頻率),用于系統(tǒng)綜合判斷,能主動(dòng)快速構(gòu)建引起電壓異常的數(shù)學(xué)模型,起動(dòng)快速安全切換邏輯,確保電源異常
    的頭像 發(fā)表于 07-19 11:17 ?457次閱讀

    可以用os_malloc() 分配多少內(nèi)存?有哪些限制?

    我可以用 os_malloc() 分配多少內(nèi)存?有哪些限制?
    發(fā)表于 07-15 06:32

    調(diào)用os_malloc時(shí)異常重啟是什么原因?qū)е碌模?/a>

    )); return node; } 明明還有足夠內(nèi)存空間的情況下,為何在os_malloc分配內(nèi)存里異常重啟? 下面是我的重啟時(shí)候的log:recv json{\"datetime\"
    發(fā)表于 07-12 07:47

    使用system_show_malloc()檢查內(nèi)存泄漏遇到異常怎么解決?

    我想使用system_show_malloc()檢查內(nèi)存泄漏,但是當(dāng)我調(diào)用該函數(shù)時(shí),我得到了致命的異常: 致命異常 28 (LoadProhibitedCause): epc1
    發(fā)表于 07-10 06:32

    ESP32設(shè)置中文藍(lán)牙設(shè)備名稱(chēng)會(huì)異常顯示亂碼,原因是什么?

    ESP32 設(shè)置中文藍(lán)牙設(shè)備名稱(chēng)會(huì)異常顯示亂碼,原因是什么? 這是因?yàn)榇藭r(shí)編輯器的中文編碼格式不是 UTF-8,需要把編輯器的編碼格式改成 UTF-8。
    發(fā)表于 06-13 06:21

    esp32s2FN4R2啟用內(nèi)置的2M PSRAM后,不斷重啟怎么解決?

    如題,開(kāi)啟外部PSRAM,檢測(cè)方式不論是auto-detect還是指定EspPsram32,編譯后都會(huì)不停重啟 試過(guò)改變其它選項(xiàng),比如內(nèi)存分配方式,不管是malloc(),還是
    發(fā)表于 06-11 08:56

    malloc和calloc功能來(lái)實(shí)現(xiàn)DAQ,在調(diào)試模式下調(diào)用calloc和malloc函數(shù)時(shí)似乎卡住了,為什么?

    我正在使用 malloc 和 calloc 功能來(lái)實(shí)現(xiàn) DAQ。 我使用的是 TLE9893 系列芯片。 代碼編譯良好,但在調(diào)試模式下調(diào)用 calloc 和 malloc 函數(shù)時(shí)似乎卡住了。 我嘗試
    發(fā)表于 05-27 08:29

    下載程序后直接運(yùn)行,SystemCoreClock異常怎么解決?

    下載程序后直接運(yùn)行,SystemCoreClock異常
    發(fā)表于 04-15 08:14

    可以在RTOS的任何位置使用malloc申請(qǐng)內(nèi)存了嗎?

    今天看了CubeIDE 1.7.0的release note ,里面寫(xiě)的一條新特性是:Thread-safe malloc solution 這是否意味著我可以在RTOS的任何位置使用malloc申請(qǐng)內(nèi)存了?
    發(fā)表于 04-03 07:23

    Stm32H7 spi會(huì)帶來(lái)更大的adc噪聲,導(dǎo)致小信號(hào)異常值的原因?

    [Stm32H7]spi會(huì)帶來(lái)更大的adc噪聲,導(dǎo)致小信號(hào)異常
    發(fā)表于 03-25 06:10

    STM32H743如何讓malloc自動(dòng)分配到外部RAM中呢?

    本人試過(guò)在進(jìn)入main之前修改啟動(dòng)文件,增加SDRAM的初始化,并且將棧空間指定在內(nèi)部防止初始化錯(cuò)誤,程序還是死在Hardfault_Handler。還有什么辦法可以將malloc自動(dòng)分配到外部RAM中呢
    發(fā)表于 03-13 07:14