获取随机SIGTRAP信号(在MinGW gdb中)是内存损坏的标志吗? 我编写了自己的引用计数内存管理器C++(用于娱乐),我确信它并不完美。现在当我尝试使用它时,我得到了随机信号。如果我注释掉与内存管理器相关的每一行,一切都会正常运行。用SIGTRAP-s代替SIGSEGV是很奇怪的。 我知道当程序遇到断点时会抛出SIGTRAP-s,但没有设置断点。我在另一个线程中读到,exe和dll的调试版本必须是最新的。它们是最新的,因此这不是原因

获取随机SIGTRAP信号(在MinGW gdb中)是内存损坏的标志吗? 我编写了自己的引用计数内存管理器C++(用于娱乐),我确信它并不完美。现在当我尝试使用它时,我得到了随机信号。如果我注释掉与内存管理器相关的每一行,一切都会正常运行。用SIGTRAP-s代替SIGSEGV是很奇怪的。 我知道当程序遇到断点时会抛出SIGTRAP-s,但没有设置断点。我在另一个线程中读到,exe和dll的调试版本必须是最新的。它们是最新的,因此这不是原因,c++,windows,memory-management,gdb,mingw,C++,Windows,Memory Management,Gdb,Mingw,有人知道为什么会发生这种情况吗?我猜您可能调用了不匹配的new/delete或malloc/free实现-因此内存管理器分配了一些内容,但当释放内存时,您最终会使用默认的delete/free实现 在信号上设置一个断点,查看堆栈上是否有free()或operator delete,以及这是否是您期望的上述函数的实现。在Google上搜索后,我意识到这些SIGTRAP与您在MSVC++中得到的警告相同“Windows已在xxxx.exe中触发断点。这可能是由于堆损坏所致,并表示存在bug blah

有人知道为什么会发生这种情况吗?

我猜您可能调用了不匹配的new/delete或malloc/free实现-因此内存管理器分配了一些内容,但当释放内存时,您最终会使用默认的delete/free实现


在信号上设置一个断点,查看堆栈上是否有free()或operator delete,以及这是否是您期望的上述函数的实现。

在Google上搜索后,我意识到这些SIGTRAP与您在MSVC++中得到的警告相同“Windows已在xxxx.exe中触发断点。这可能是由于堆损坏所致,并表示存在bug blahblahblah“

因此,似乎是的,意外的信号陷阱可以指示内存损坏(非常奇怪…)


我也发现了我的错误。MM在一个链接到dll的静态库中。静态库和dll链接到我的exe。所以有两个内存管理器,一个在我的exe中,一个在我的dll中。如果调用MM的初始化方法。它初始化了我的exe中的MM,但不在dll中,所以dll没有初始化。我用n解决了这个问题ot将我的exe链接到静态库。

既然你在Windows上,几乎肯定不会得到任何SIGTRAP(这是一个UNIX概念,根本不适用于Windows)。为什么不编辑你的问题来描述你实际观察到的情况呢?Well MinGW也说Windows下的SIGTRAP。