问题描述
我正在将 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
。