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它崩溃了。请帮帮我。
答案 0 :(得分:1)
这很可能是双重删除而不将指针设置为NULL。要验证它应该可以通过检查指针的内存地址在调试器中看到它。
可能的情况是您有多个线程删除列表。
答案 1 :(得分:1)
delete [] (char *) ptr;
我无法理解为什么会发生崩溃
崩溃通常是未定义行为的结果。 delete[]
可能具有未定义行为的典型原因是:
ptr
指向的内存从未使用new char[]
分配。也许指针未初始化并指向内存中的随机位置。或者,也许内存分配了new
而不是new[]
。或者,它可能指向具有自动或静态存储的阵列。ptr
指向的内存已正确分配,但已被删除。或者,之前的堆可能已被其他一些未定义的行为破坏。
即使ptr不是NULL
您做出了错误的假设。如果ptr
为NULL
,则删除可能无法使程序崩溃。
答案 2 :(得分:0)
也许ptr
不是NULL但它应该是?
添加或后,可能未正确设置node->next
或node->prev
删除一个节点(以便后续的删除操作失败)或者有未初始化的节点数据(指针类型为
哪个ACE_New_Allocator::malloc
未被调用且指针未设置为NULL)您正在尝试
删除节点时自由。