在我的项目中,我使用了大约 4 个按照 Scott Meyer 的方式制作的单身人士。其中之一:
LevelRenderer& LevelRenderer::Instance()
{
static LevelRenderer obj;
return obj;
}
现在是其中的两个 Singleton,LevelRenderer
并LevelSymbolTable
相互交互。例如,在这个方法中:
void LevelRenderer::Parse(std::vector<std::string>& lineSet)
{
LevelSymbolTable& table = LevelSymbolTable::Instance();
/** removed code which was irrelevant **/
// for each line in lineSet
BOOST_FOREACH(std::string line, lineSet)
{
// for each character in the line
BOOST_FOREACH(char sym, line)
{
/** code... **/
// otherwise
else
{
sf::Sprite spr;
// Used LevelSymbolTable's Instance here...
table.GenerateSpriteFromSymbol(spr, sym);
// ^ Inside LevelRenderer
/** irrelevant code... **/
}
}
}
}
现在,虽然问题还没有出现。我害怕的是,如果实例在我调用之前LevelSymbolTable
已经被销毁了怎么办?GenerateSpriteFromSymbol
由于我使用的是 Scott Meyer 方式,Singleton 的实例是由堆栈分配的。因此保证使用最后创建的第一个销毁规则被销毁。现在如果LevelSymbolTable
' 的 Instance 是在 ' 的 Instance 之后 LevelRenderer
创建的,它会在 ' 的 Instance之前 LevelRenderer
被销毁,对吧?那么,如果我调用LevelSymbolTable
inside的方法LevelRenderer
(尤其是在LevelRenderer
's 的析构函数中),我将踏上未定义的行为领域。
正如我之前所说,这个问题在调试时实际上并没有发生,纯粹是我的假设和猜测。那么,我的结论正确吗?很LevelSymbolTable
容易被销毁之前LevelRenderer
。如果是这样,有没有办法摆脱这种混乱?