free()的内存错误

时间:2011-07-20 12:25:03

标签: c multithreading memory

我在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);


}

4 个答案:

答案 0 :(得分:3)

你可以处理SIGINT,但没关系,你的代码在你想要进行额外的free()调用时已经破坏了内存。

找到问题,使用-g对其进行编译,并使用valgrind运行。

答案 1 :(得分:1)

使用信号处理程序捕获Ctrl-C事件(Ctrl-C生成SIGINT信号),并在处理程序中设置一个标志。修改无限循环,使其在看到标志时停止循环,并在循环后写入清理代码。然后你的程序将“正常”结束。

信号处理函数是GNU C库(以及任何POSIX系统,我认为)的一部分。 here是有关信号处理的gnu c库文档的链接。

答案 2 :(得分:1)

尝试通过Valgrind运行程序,看看是否可以获得有关内存分配结构损坏位置的任何帮助。从错误看,你在某处做了一些内存分配无效的事情,这会破坏内存数据结构的内存分配。

答案 3 :(得分:0)

您的堆空间已损坏。也许你正在写出一大块已分配内存的结束(或在开始之前)。免费检测到损坏并产生错误。

当程序终止时,所有内存将自动释放。