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