우리는 각각 다른 개발자가 개발 한 3 개의 다른 라이브러리를 가지고 있으며 각각은 (아마도) 잘 설계되었습니다. 그러나 일부 라이브러리는 RAII를 사용하고 일부 라이브러리는 RAII를 사용하지 않기 때문에 일부 라이브러리는 동적으로로드되고 다른 라이브러리는 그렇지 않습니다. 작동하지 않습니다.C++에서 RAII 코드와 비 RAII 코드를 함께 사용하는 문제를 해결하는 방법은 무엇입니까?
각 개발자는 자신이 한 일이 옳다고 말하고이 경우에만 방법론을 변경하면 (예 : B에서 RAII 싱글 톤 만들기) 문제를 해결할 수 있지만 추악한 패치로 보입니다.
이 문제를 해결하려면 어떻게 권장합니까?
내 코드 :
static A* Singleton::GetA()
{
static A* pA = NULL;
if (pA == NULL)
{
pA = CreateA();
}
return pA;
}
Singleton::~Singleton() // <-- static object's destructor,
// executed at the unloading of My Dll.
{
if (pA != NULL)
{
DestroyA();
pA = NULL;
}
}
(다른 DLL에서 내의 DLL에 정적으로 링크)
"A"코드 :
문제를 이해하기 위해 코드를 참조하십시오
A* CreateA()
{
// Load B Dll library dynamically
// do all other initializations and return A*
}
void DestroyA()
{
DestroyB();
}
(A에서 동적으로로드 된 다른 DLL에서)
"B"코드 :
static SomeIfc* pSomeIfc;
void DestroyB()
{
if (pSomeIfc != NULL)
{
delete pSomeIfc; // <-- crashes because the Dll B was unloaded already,
// since it was loaded dynamically, so it is unloaded
// before the static Dlls are unloaded.
pSomeIfc = NULL;
}
}
"B"DLL의 조기 언로드를 일으키는 원인이 무엇인지 명확하지 않습니다. 분명히 할 수 있습니까? Offhand는 B DLL이 언로드되어 라이브러리의 사용 범위를 더 적절하게 일치시키는 지점을 수정하는 것으로 보입니다. 예를 들어 DLL이 CreateA에로드 된 경우 DestroyA에서 언로드해야합니다. –
RAII 래퍼를 만드는 것은 결코 못생긴 해킹이 아닙니다. – avakar