Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++ Linux中损坏的双链表_C++_Linux - Fatal编程技术网

在C++ Linux中损坏的双链表

在C++ Linux中损坏的双链表,c++,linux,C++,Linux,请看上面的代码。我不明白为什么会发生崩溃,即使ptr不是NULL。如果我试图访问或释放ptr,它将崩溃。请帮帮我 也许ptr不是空的,但它应该是空的 添加或删除后,可能没有正确设置节点->下一个或节点->上一个 删除节点,以便后续删除操作失败,或者存在未初始化的节点数据,该节点的指针类型为 未调用哪个ACE_New_分配器::malloc,并且指针未设置为您尝试调用的NULL 删除节点时释放。这很可能是双重删除,而没有将指针设置为NULL。要验证,应该可以通过检查指针的内存地址在调试器中看到 一

请看上面的代码。我不明白为什么会发生崩溃,即使ptr不是NULL。如果我试图访问或释放ptr,它将崩溃。请帮帮我

也许ptr不是空的,但它应该是空的

添加或删除后,可能没有正确设置节点->下一个或节点->上一个 删除节点,以便后续删除操作失败,或者存在未初始化的节点数据,该节点的指针类型为 未调用哪个ACE_New_分配器::malloc,并且指针未设置为您尝试调用的NULL
删除节点时释放。

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

一种可能的情况是有多个线程删除列表

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)
我不明白为什么会发生车祸

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

从未使用新字符[]分配ptr指向的内存。可能指针未初始化,指向内存中的随机位置。或者,可能内存是用new而不是new[]分配的。或者,它可能指向具有自动或静态存储的阵列。 ptr指向的内存已正确分配,但已被删除。 或者,堆可能已被其他一些先前未定义的行为损坏

即使ptr不是空的


你的假设不正确。如果ptr为NULL,则删除可能不会使程序崩溃。

删除NULL指针不会导致崩溃:请参阅和。导致崩溃的原因是删除指向您不拥有的内存的指针,请参见和。null pointer的许多含义,可能他的null不是nullptr!崩溃可能是由程序早期某个地方的内存以多种不同方式损坏引起的。不可能说出原因是什么;最好使用valgrind之类的工具。错误来自内存管理器的内部深处,其最终原因是您对应用程序中的内存管理不当,导致内存管理器的内部结构被破坏。我认为这与用户的链接列表无关,它与内存管理器链接列表有关,但删除ptr[]也会崩溃;这是我用来删除[]ptr的函数。不清楚。需要更多的代码来理解ptr是什么,它指向什么,它来自哪里,等等。。。也许你可以更新你的问题来添加一些代码。据我所知,您创建了一些双链接列表并对其进行了管理。需要查看代码。谢谢。。我怀疑ptr是否删除了alredy。。它指向的内存位置应该是NULL0x000 ryt?我已经编写了一个示例程序。如果我们删除ptr,它将不会为空ptr。Thanks@SanthoshKumar实际上,删除指针不会将其设置为空。它仍然会指向它所指向的位置,取消引用或删除它将具有未定义的行为。@SanthoshKumar我们无法判断指针是否被删除。我们必须分析我们的源代码,并证明指针在被删除后从未被删除或取消引用。如果我们复制原始指针,证明这一点就变得非常困难。你应该不惜一切代价避免那样做。智能指针和标准容器的使用使得证明更加容易,而且即使在使用它们时发生意外,也很少可以进行双重删除。
delete [] (char *) ptr;