1

我在 C\C++ 中创建无锁队列,队列工作正常,但出现错误,Visual Studio 显示它是免费操作,并且它在此函数上崩溃

extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer( const void * pUserData)

当有很多阅读线程(使用免费的线程)时,就会发生这种情况,如果我删除 free 它适用于任意数量的线程,或者如果我放置简单的 printf("random stuff"); (它明显减慢了一点)它适用于任意数量的线程。所以我只是不知道该怎么做:(看起来如果很多线程试图释放内存窗口无法处理它,这可能是问题吗?当变量地址变为“魔术”时,我也会遇到访问冲突(0xABABABAB, 0xCDCDCDCD..),我发现这些也和堆有关..

在 linux 中,Posix 线程没有任何问题,适用于任意数量的线程。

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

来源: queue.c queue.h

4

1 回答 1

1

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

如果您通过静态链接和其他 dll/exe 作为针对 MSVC 运行时的动态链接制作其中一个 dll,您可能会遇到此类问题。

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

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

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

希望这可以帮助,

问候

于 2012-11-27T14:32:03.273 回答