我们有 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”代码(在另一个 Dll 中,从 A 动态加载):
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;
}
}