3 つの異なるライブラリがあり、それぞれが異なる開発者によって開発されており、それぞれが (おそらく) 適切に設計されています。しかし、一部のライブラリは 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;
}
}
「A」コード(私のDllに静的にリンクされた別のDll内):
A* CreateA()
{
// Load B Dll library dynamically
// do all other initializations and return A*
}
void DestroyA()
{
DestroyB();
}
「B」コード (A から動的にロードされる別の Dll 内):
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;
}
}