Windows heap corruption C++C

Windows heap corruption C++C

本文关键字:C++ corruption heap Windows      更新时间:2023-10-16

我正在C\C++中创建无锁定队列,队列工作正常,但我遇到了错误,Visual studio显示它是自由操作的,而且它在这个函数上崩溃了

extern"C"_CRTIMP int __cdecl_CrtIsValidHeapPointer(const void*pUserData)

当有很多读取线程(使用free的线程)时就会发生这种情况,如果我删除free,它可以与任何数量的线程一起工作,或者如果我放入简单的printf("随机的东西");(速度慢了一点)它可以很好地处理任何数量的线程。所以我不知道该怎么办:(看起来如果很多线程试图释放内存,窗口无法处理,这可能是问题所在吗?此外,我还遇到了访问冲突,当变量地址变为"魔术"(0xABABABAB,0xCDCDCD..)时,我发现这些也与堆有关。)。。

在linux中,Posix线程没有任何问题,可以与任何数量的线程一起工作。

所以,问题是,为什么放慢线程速度会有所帮助(或者这是巧合?)以及如何在不放慢速度的情况下解决堆问题?欢迎任何关于堆内存的建议。

来源:queue.cqueue.h

当我试图从MFC gui调用我的一个dll时,我遇到了类似的问题。

如果您通过静态链接创建了一个dll,而将另一个dll/exe作为MSVC Runtime的动态链接,则可能会遇到这种问题。

与针对MSVC Runtime的动态链接dll相比,针对MSVC运行时的静态链接dll似乎在不同的上下文中运行,即使它们在同一应用程序中使用。

基本上,如果释放或返回从两个不同上下文创建的指针,就会发生堆损坏。如果你在VS中调试程序,它不会显示任何错误。但如果运行它,它将在退出返回上下文后显示堆损坏错误。

一种可能的解决方案是根据MSVC运行时动态链接所有dll

希望这能有所帮助,

关于