一个无符号的字符向量释放是如何用segfault..使程序崩溃的



在正常的对象释放过程中,我实际上正在释放一个无符号字符向量,它在vector_base deallocation free((处与segfault崩溃:

[Switching to Thread 17648.0x3528]
0x00007ff9ba0a9606 in ntdll!RtlAllocateHeap () from C:WINDOWSSYSTEM32ntdll.dll
(gdb) back
#0  0x00007ff9ba0a9606 in ntdll!RtlAllocateHeap () from C:WINDOWSSYSTEM32ntdll.dll
#1  0x00007ff9ba0a5d21 in ntdll!RtlFreeHeap () from C:WINDOWSSYSTEM32ntdll.dll
#2  0x00007ff9b9839c9c in msvcrt!free () from C:WINDOWSSystem32msvcrt.dll
#3  0x00000000004bc540 in __gnu_cxx::new_allocator<unsigned char>::deallocate(unsigned char*, unsigned long long) ()
#4  0x00000000004ea87b in std::allocator_traits<std::allocator<unsigned char> >::deallocate(std::allocator<unsigned char>&, unsigned char*, unsigned long long) ()
#5  0x00000000004df392 in std::_Vector_base<unsigned char, std::allocator<unsigned char> >::_M_deallocate(unsigned char*, unsigned long long) ()
#6  0x00000000004df436 in std::_Vector_base<unsigned char, std::allocator<unsigned char> >::~_Vector_base() ()
#7  0x000000000050110d in std::vector<unsigned char, std::allocator<unsigned char> >::~vector() ()
#8  0x0000000000420dd4 in Text::~Text() ()
#9  0x000000000041c9f7 in Scene::clearOnScreenText() ()
#10 0x0000000000410a52 in Application::NextScene() ()
#11 0x0000000000412a41 in Application::update() ()
#12 0x00000000004119a8 in Application::Run()::{lambda()#2}::operator()() const ()
#13 0x000000000041501a in std::_Function_handler<void (), Application::Run()::{lambda()#2}>::_M_invoke(std::_Any_data const&) ()
#14 0x00000000004cad92 in std::function<void ()>::operator()() const ()
#15 0x000000000051fba9 in std::intervalThread(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::function<void ()>, std::function<void ()>, std::function<void ()>, std::function<bool ()>, long long, std::vector<long long, std::allocator<long long> >*, bool)::{lambda()#1}::operator()() const ()

只有三个问题:

这怎么可能呢?

我做错了什么。。。?

最重要的是,如何解决这个问题?

旁注:

我最近在释放内存方面遇到了一些问题(特别是在这个程序中(,那么MinGW可能有问题吗,或者GDB可能没有正确读取堆栈?所有调试符号都关闭,优化为0;

这怎么可能?

有了未定义的行为,一切皆有可能。:(更有用的是,可能发生的情况是您的堆已损坏(例如,由于某个地方的错误内存写入(,并且new_allocator<unsigned char>::deallocate()方法试图取消引用堆元数据中的错误指针,这导致了崩溃。。。但在程序执行的早些时候,这种损害已经悄悄地造成了。

另一种可能性是clearOnScreenText()试图在无效(但非NULL(的Text *指针上调用delete,因此当Text::~Text()试图运行std::vector<char>成员变量的析构函数时,它试图破坏一个";矢量对象";这实际上只是任意字节,对于向量来说不是有效状态,会带来灾难性的后果。

最重要的是,如何解决这个问题?

如果您可以在Linux上运行代码,那么valgrind在这种情况下是一个很有价值的工具。在Windows下,也有类似的工具(我想其中一个叫做Electric Fence,但我忘了还有什么(。除此之外,你可能不得不开始玩";二十个问题";对于代码,通过注释掉程序的各个部分,直到崩溃消失,然后将它们重新添加到程序中,直到崩溃恢复,然后重复,直到您更好地了解需要执行代码的哪些部分才能重现崩溃。一旦您确定了要查看的代码,就可以开始尝试找出可疑代码中的错误。非常乏味,但有时这是唯一的方法。