我在C中运行两个独立的线程,都在做一些操作。两个线程都包含无限循环。当我运行这个程序几次时,我总是会出现内存泄漏错误。
*** glibc detected *** ./a.out: free(): invalid next size (normal): 0x08652510 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6c501)[0x3d1501]
...
我认为这是一个内存错误,问题是,当我总是需要停止该程序时(因为我还在测试它),我只是用Ctrl+C
终止程序,所以我相信我总是想念free(anything)
命令,然后导致错误。
你能告诉我如何避免这种情况吗?所以即使我终止程序,我也能free()
内存?
我想到的下一件事是,当我等待几分钟然后再次运行程序时,它再次完美运行
感谢任何提示
void *lineOne(void *dataO)
{
struct IPlist *IPlist = dataO;
static struct ARP_entryI ARP_tableI[ARP_TABLE_SIZE];
int neigh=0; //pocet susedov
int neigh1=0; //stav pred tym
int i;
getAddress();
while(1)
{
while (neigh == neigh1)
{
neigh =rcvBroad(IPlist, neigh);
}
neigh1=neigh;
for (i=neigh ; i<neigh+1; i++)
{
main_client(ARP_tableI, IPlist[i-1].IPaddr); // vysle tcp, prijme arp
getAddress();
}
}
}
//pocuvaServer, odpoveda ARP
void *lineTwo()
{
static struct ARP_entryO ARP_tableO[ARP_TABLE_SIZE];
int line = from_local_arp(ARP_tableO);
main_server(ARP_tableO, line); // pocuva tcp, vysle arp
}
void main()
{
static struct IPlist *IPlist[ARP_TABLE_SIZE];
pthread_t thread1, thread2;
int iret1, iret2;
/* Create independent threads each of which will execute function */
iret1 = pthread_create( &thread1, NULL, lineOne, (void *)IPlist); //(void *) &
iret2 = pthread_create( &thread2, NULL, lineTwo, NULL);
pthread_join( thread1, NULL);
pthread_join( thread2, NULL);
}
答案 0 :(得分:3)
你可以处理SIGINT,但没关系,你的代码在你想要进行额外的free()
调用时已经破坏了内存。
找到问题,使用-g
对其进行编译,并使用valgrind
运行。
答案 1 :(得分:1)
使用信号处理程序捕获Ctrl-C事件(Ctrl-C生成SIGINT信号),并在处理程序中设置一个标志。修改无限循环,使其在看到标志时停止循环,并在循环后写入清理代码。然后你的程序将“正常”结束。
信号处理函数是GNU C库(以及任何POSIX系统,我认为)的一部分。 here是有关信号处理的gnu c库文档的链接。
答案 2 :(得分:1)
尝试通过Valgrind运行程序,看看是否可以获得有关内存分配结构损坏位置的任何帮助。从错误看,你在某处做了一些内存分配无效的事情,这会破坏内存数据结构的内存分配。
答案 3 :(得分:0)
您的堆空间已损坏。也许你正在写出一大块已分配内存的结束(或在开始之前)。免费检测到损坏并产生错误。
当程序终止时,所有内存将自动释放。