【发布时间】:2009-12-30 07:53:13
【问题描述】:
我们有 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;
}
}
【问题讨论】:
-
我不清楚是什么导致了“B”DLL 的过早卸载,你能澄清一下吗?临时解决方案似乎正在修改 B DLL 的卸载点,以更恰当地匹配 A 库的使用范围。例如,如果 DLL 在 CreateA 中加载,它应该在 DestroyA 中卸载。
-
创建一个 RAII 包装器绝不是一个丑陋的 hack。
标签: c++ dll static singleton raii