Visual c++ VC++本机互斥堆损坏 我有一个本地C++库,它被托管C++应用程序使用。本地库是不使用CLR支持编译的,托管的C++应用程序带有IT/CLR编译器选项。
当我在本机库中使用std::mutex时,当所属的本机类被删除时,我会得到一个堆损坏。MutX .h的使用被托管C++阻塞,所以我猜这可能是原因之一。 演示此问题的最小本机类是: 标题:Visual c++ VC++本机互斥堆损坏 我有一个本地C++库,它被托管C++应用程序使用。本地库是不使用CLR支持编译的,托管的C++应用程序带有IT/CLR编译器选项。,visual-c++,mutex,heap-corruption,Visual C++,Mutex,Heap Corruption,当我在本机库中使用std::mutex时,当所属的本机类被删除时,我会得到一个堆损坏。MutX .h的使用被托管C++阻塞,所以我猜这可能是原因之一。 演示此问题的最小本机类是: 标题: #pragma once #include <stdio.h> #ifndef __cplusplus_cli #include <mutex> #endif namespace MyNamespace { class SomeNativeLibrary {
#pragma once
#include <stdio.h>
#ifndef __cplusplus_cli
#include <mutex>
#endif
namespace MyNamespace {
class SomeNativeLibrary
{
public:
SomeNativeLibrary();
~SomeNativeLibrary();
void DoSomething();
#ifndef __cplusplus_cli
std::mutex aMutex;
#endif
};
}
托管C++控制台应用程序:
int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Unit Test Console:");
MyNamespace::SomeNativeLibrary *someNativelib = new MyNamespace::SomeNativeLibrary();
someNativelib->DoSomething();
delete someNativelib;
getchar();
return 0;
}
尝试删除someNativeLib指针时发生堆损坏调试错误
我可以做些什么来安全地使用本机库中的std::mutex,或者有其他方法可以使用吗?在我的实时代码中,使用互斥是为了确保只有一个线程访问std::vector。解决方案是使用a作为锁。在我的例子中,它实际上比互斥锁更有效,因为锁只用于同一进程中的线程。也许您可以将std::mutex放在一个pimpl类中,而不需要放在SomeNativeLibrary头中-只有指向pimpl类的指针或std::unique_ptr需要直接放在SomeNativeLibrary类定义中。这样一来,SomeNativeLibrary对于本地用户和托管用户来说就可以是一样的,我认为它必须一直工作下去。
int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Unit Test Console:");
MyNamespace::SomeNativeLibrary *someNativelib = new MyNamespace::SomeNativeLibrary();
someNativelib->DoSomething();
delete someNativelib;
getchar();
return 0;
}