动态内存分配硬故障问题

问题描述

我正在将 stm32f4 微处理器和 lwip 库用于某些以太网进程。

我在动态内存分配方面遇到问题。出于某种原因,当我向我的硬件发送 ping 时,此设备在 1 小时后遇到硬故障问题。

这些是我在 main.c 中的固件程序

while(1)
{
    uint8_t * incomingData = ethernetif_input(&gnetif);
    
    if(incomingData != NULL)
    {
        if(incomingData[0] == 0x01)
        {
            // doing some process
        }
        incomingData = NULL;
        free(incomingData)
    }
}

ethernetif.c中:

uint8_t * ethernetif_input(struct netif *netif)
{
    struct pbuf *p;
    p = low_level_input(netif);
        if (p == NULL) {
        return NULL;
    }
    uint8_t * data = (uint8_t*)(malloc(sizeof( uint8_t) * 61U));
    if ((memcmp (p->payload,EXPECTED_ETHERNET_FRAME,6) == 0))
    {
        for(int i = 0; i < 61; i++) 
        {
            data[i]=(((uint8_t*)p->payload)[i]);
        }
    }
    else
    {
        err = netif->input(p,netif);
        data = NULL;
        free(data);
        if (err != ERR_OK)
        {
            pbuf_free(p);
            p = NULL;
        }
        {
        if(p != NULL)
        {
            pbufFreeErr = pbuf_free(p);
            if( !(_Bool)pbufFreeErr)
            {
        
            } 
    }
    return data;
}

解决方法

您的内存不足。

正如评论中已经提到的:data=NULL; free(data) 没有意义。它说忘记数据指向什么,然后什么都不做。 在将其设置为 NULL 之前,您应该先 free(data)。这将使 data 指向的内存可用于未来的 malloc 调用。

而且您还应该在所有情况下都调用 pbuf_free,否则会耗尽内存。

最后一点,不要使用 for 循环复制缓冲区,使用 memcpy