c ++ Linux中损坏的双链表

时间:2015-11-03 14:20:40

标签: c++ linux

gdb) s
ACE_New_Allocator::free (this=0x8621380  <ACE_Allocator::instance()::allocator_instance>, ptr=0x86549e0) at Malloc_Allocator.cpp:151
151       if(NULL != ptr)
gdb)l
148    void  ACE_New_Allocator::free (void *ptr)
149     {
150     /*S7CHANGES START*/
151       if(NULL != ptr)
152               delete [] (char *) ptr; // crash happens. But Ptr is not NULL
153     /*S7CHANGES END*/         
154     }
gdb) p ptr
$1 = (void *) 0x86549e0
(gdb) p (char*)ptr[0] // tried to access ptr[0] & application crashed.
*** Error in `/home/ic018596/views/s7p.omsp/oms/interm/Linux/Make/Debug/test/UnmanagedTests/CPPUnit/ToolsPlusTest_EsT1_Tcp/out/ToolsPlusTest': corrupted double-linked list: 0x086559e0 ***
Segmentation fault (core dumped)

请看上面的代码。我无法理解崩溃发生的原因,即使ptr不是NULL。如果我试图访问或释放ptr它崩溃了。请帮帮我。

3 个答案:

答案 0 :(得分:1)

这很可能是双重删除而不将指针设置为NULL。要验证它应该可以通过检查指针的内存地址在调试器中看到它。

可能的情况是您有多个线程删除列表。

答案 1 :(得分:1)

delete [] (char *) ptr;
  

我无法理解为什么会发生崩溃

崩溃通常是未定义行为的结果。 delete[]可能具有未定义行为的典型原因是:

  • ptr指向的内存从未使用new char[]分配。也许指针未初始化并指向内存中的随机位置。或者,也许内存分配了new而不是new[]。或者,它可能指向具有自动或静态存储的阵列。
  • ptr指向的内存已正确分配,但已被删除。

或者,之前的堆可能已被其他一些未定义的行为破坏。

  

即使ptr不是NULL

您做出了错误的假设。如果ptrNULL,则删除可能无法使程序崩溃。

答案 2 :(得分:0)

也许ptr不是NULL但它应该是?

添加或后,可能未正确设置node->nextnode->prev    删除一个节点(以便后续的删除操作失败)或者有未初始化的节点数据(指针类型为    哪个ACE_New_Allocator::malloc未被调用且指针未设置为NULL)您正在尝试    删除节点时自由。