私のプロジェクトでは、スコット・マイヤーのやり方で作られた約4つのシングルトンを使用しています。それらの中の一つ:
LevelRenderer& LevelRenderer::Instance()
{
static LevelRenderer obj;
return obj;
}
今、それらのシングルトンのうちの2つであり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
スコットマイヤーの方法を使用したので、シングルトンのインスタンスはスタックによって割り当てられました。したがって、最後に作成された最初に破棄されたルールを使用して破棄されることが保証されます。さて、インスタンスがインスタンスの後にLevelSymbolTable
作成された場合、インスタンスの前に破棄されますよね?したがって、内部のメソッド(特にのデストラクタ)を呼び出すと、未定義の動作の土地を踏みます。 LevelRenderer
LevelRenderer
LevelSymbolTable
LevelRenderer
LevelRenderer
前に述べたように、この問題はデバッグ中に実際には発生しておらず、純粋に私の仮定と推測です。それで、私の結論は正しいですか?LevelSymbolTable
前に破壊されやすいですLevelRenderer
。もしそうなら、この混乱から抜け出す方法はありますか?