Проблема жесткого выделения динамической памяти

#c #pointers #lwip

#c #указатели #lwip

Вопрос:

Я использую микропроцессор stm32f4 и библиотеку lwip для некоторого процесса Ethernet.

У меня проблема с динамическим выделением памяти. По какой-то причине, когда я отправляю ping на свое оборудование, это устройство испытывает проблему с жестким выделением памяти через 1 час.

Это моя процедура прошивки в main.c

 while(1)
{
    uint8_t * incomingData = ethernetif_input(amp;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;
}

 

Комментарии:

1. incommingData = NULL; free(incommingData); Обратите внимание на порядок этих двух.

2. Это неправильное использование? Когда я использую источник в Интернете. Люди, использующие этот способ. Как я могу их использовать?

3. Что это делает, так это incommingData = NULL; free(NULL); . Что вы, вероятно, имели в виду, так это free(incommingData); incommingData = NULL; .

4. @dxiv Так это единственная проблема с моим кодом? Это из-за сбоев в работе?

5. Что касается free(incommingData); incommingData = NULL; : каждый раз, когда это выполняется (сначала вы переопределяете указатель на (надеюсь) какой-то выделенный материал, а затем пытаетесь free() NULL использовать указатель), вы можете вызвать утечку памяти . Рано или поздно это поглотит всю доступную память кучи. Я не знаю, что такое жесткий сбой, но в итоге у вас больше не будет доступной кучи, что обычно останавливает систему. (На моем компьютере я заметил, что в таких случаях даже указатель мыши больше не перемещается.)

Ответ №1:

У вас заканчивается память.

Как уже упоминалось в комментариях: data=NULL; free(data) не имеет смысла. В нем говорится, что забудьте, на что указывают данные, а затем ничего с этим не делайте. Вы должны сначала free(data) , прежде чем устанавливать для него значение NULL. Это сделает память, на которую указывает by data , доступной для будущих malloc вызовов.

И вы также должны вызывать pbuf_free во всех случаях, у вас закончится память, если вы этого не сделаете.

В качестве последнего замечания, не используйте цикл for для копирования буфера, используйте memcpy .

Комментарии:

1. спасибо за ваш совет, я не использовал memcpy, но я использую memcmp