#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