Ошибка памяти со свободным () - PullRequest
1 голос
/ 20 июля 2011

Я запускаю два отдельных потока в 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 ]

3 голосов
/ 20 июля 2011

вы можете обработать SIGINT, но это не имеет значения, ваш код уже повреждает память к тому времени, когда вы хотите выполнить этот дополнительный free() вызов.

, чтобы найти проблему, скомпилируйте ее с -g и запустите его с valgrind.

1 голос
/ 20 июля 2011

Попробуйте запустить вашу программу через Valgrind и посмотрите, можете ли вы получить какую-либо помощь в том, где структура распределения памяти повреждена.Из-за ошибки похоже, что вы где-то делаете что-то недопустимое с выделением памяти, это повреждает внутренние структуры данных для выделения памяти.

1 голос
/ 20 июля 2011

используйте обработчик сигнала для перехвата события Ctrl-C (Ctrl-C генерирует сигнал SIGINT) и установите флаг в обработчике. измените бесконечный цикл так, чтобы он прекратил цикл, когда он видит флаг, и напишите код очистки после цикла. ваша программа завершится "нормально".

функции обработки сигналов являются частью библиотеки GNU C (и, я думаю, любой системы POSIX). здесь - ссылка на документацию библиотеки gnu c, касающуюся обработки сигналов.

0 голосов
/ 20 июля 2011

Вы испортили пространство кучи. Возможно, вы записываете конец (или перед началом) части выделенной памяти. Бесплатно обнаружение повреждения и выдача ошибки.

Когда программа завершается, вся память освобождается автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...