***错误:双重释放或损坏(输出):0x00007fffe3465010 ***。警告:损坏的共享库列表:0x7ffea4000920!= 0x7ffff7ffd9d8

时间:2017-06-15 18:44:27

标签: c pointers linked-list free double-free

void *insert_rear_node(void *arg)
{   
  int *argument=(int *)arg;
  int value=*argument;
  //Assume that allocation is happening fine (Just like malloc , it is a custom heap allocator)

  struct Node *head=(struct Node *) RTallocate(RTpointers, sizeof(struct Node));
  struct Node *temp;
  setf_init(temp,head);

  while(value>0)
    {
      if(temp==NULL)
        {
          RTwrite_barrier(&(temp), new_node(value,NULL));
          RTwrite_barrier(&(head),temp);
          printf("Inserted %d into the list\n",head->data);
        }
      else
        {
          RTwrite_barrier(&(temp),head);
          while(temp->next!=NULL)
            {
              RTwrite_barrier(&(temp),temp->next);
            }
          RTwrite_barrier(&(temp->next),new_node(value,NULL));
          printf("Inserted %d into the list\n",temp->next->data);
        }
      value=value-1;

    }
  free(head);

}

int main(int argc, char *argv[])
{                                                                                                                                                                                                                              
  long heap_size = (1L << 28);
  long static_size = (1L << 26);
  printf("heap_size is %ld\n", heap_size);
  RTinit_heap(heap_size, static_size, 0);                                                                                                                                                                                                                 
  pthread_t thread1;                                                                                                                                                                                                                                   
  int limit=1000;
  RTpthread_create(&thread1,NULL,insert_rear_node,(void *)&limit);
}

假设RTallocate和RTwrite_barrier是2个自定义函数,它们可以正常工作。 RTallocate - 在堆上分配内存 RTwrite_barrier相当于一个assignemnt语句。

该程序只是将节点插入到链表中。 然后尝试删除头部。

  

我收到此错误:
  `/ home / test / RT-Test / InMul'出错:双重释放或损坏(out):0x00007fffe3465010
  警告:共享库列表已损坏:   0x7ffea4000920!= 0x7ffff7ffd9d8
  ======= Backtrace:=========
  /lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7ffff77f97e5]
  /lib/x86_64-linux-gnu/libc.so.6(+0x7fe0a)[0x7ffff7801e0a]
  /lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7ffff780598c]
  /家/测试/ RT-测试/ InMul [0x400b98]
  /lib/x86_64-linux-gnu/librtgc.so(rtalloc_start_thread+0x1ef)[0x7ffff7b4fa2c]   /lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba)[0x7ffff756c6ba]   /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x7ffff788882d]


我只有一次解职。我为什么要面对这个问题?
0x00007fffe3465010是头部的地址。

2 个答案:

答案 0 :(得分:1)

当你没有使用malloc()作为head时,你不能使用free()。使用免费的等效RTallocate。

答案 1 :(得分:1)

你没有告诉我们的一些代码,很可能无处接近你认为是问题的代码,已经损坏了malloc的内部簿记数据。

valgrind下运行您的程序并修复它报告的第一个无效操作。重复直到valgrind不再抱怨。现在你的程序应该工作了。如果您不理解valgrind的输出,请将首先 20行左右的行编辑到您的问题中,我们也可以解释一下。