Visual c++ VC++本机互斥堆损坏 我有一个本地C++库,它被托管C++应用程序使用。本地库是不使用CLR支持编译的,托管的C++应用程序带有IT/CLR编译器选项。

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 {

当我在本机库中使用std::mutex时,当所属的本机类被删除时,我会得到一个堆损坏。MutX .h的使用被托管C++阻塞,所以我猜这可能是原因之一。 演示此问题的最小本机类是:

标题:

#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;
}