2014-12-15 8 views
0

관리 C++ 응용 프로그램에서 사용하는 네이티브 C++ 라이브러리가 있습니다. 네이티브 라이브러리는 CLR 지원 및 관리되는 C++ 응용 프로그램 (/ CLR 컴파일러 옵션)없이 컴파일됩니다.VC++ 네이티브 뮤텍스 힙 손상

기본 라이브러리에서 std :: mutex를 사용할 때 소유 원시 클래스가 삭제되면 힙 손상이 발생합니다. mutex.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 

    }; 
} 

구현 :

#include "SomeNativeLibrary.h" 

namespace MyNamespace { 
    SomeNativeLibrary::SomeNativeLibrary() 
    {} 

    SomeNativeLibrary::~SomeNativeLibrary() 
    {} 

    void SomeNativeLibrary::DoSomething(){ 
     printf("I did something.\n"); 
    } 
} 

관리 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를 안전하게 사용할 수 있습니까? 아니면 사용할 수있는 대안이 있습니까? 내 라이브 코드에서 mutex는 단일 스레드 만 std :: vector에 액세스하도록하는 데 사용됩니다.

+0

아마도'SomeNativeLibrary' 헤더에 넣지 않아도되는 pimpl 클래스에'std :: mutex'를 넣을 수 있습니다 - 단지 포인터 (또는'std :: unique_ptr <>') 만 pimpl 클래스에 넣을 수 있습니다 'SomeNativeLibrary' 클래스 정의에 직접 있어야합니다. 그런 식으로'SomeNativeLibrary'는 기본 사용자와 관리되는 사용자가 동일 할 수 있습니다 (상상해보십시오). –

답변

0

해결책은 대신 잠금으로 CRITICAL_SECTION을 사용하는 것이 었습니다. 실제로 잠금은 동일한 프로세스의 스레드에만 해당되므로 내 사건의 뮤텍스보다 훨씬 효율적입니다.