функция статических объектов, таких как глобальные объекты, гарантированно будет уничтожена (при условии, что они созданы).
Порядок уничтожения является обратным созданию.
Таким образом, если объект зависит от другого объекта во время уничтоженияВы должны гарантировать, что это все еще доступно.Это относительно просто, так как вы можете форсировать порядок уничтожения, убедившись, что порядок создания выполнен правильно.
Следующая ссылка о одиночных кнопках, но описывает похожую ситуацию и ее решение:
Поиск проблем порядка статической инициализации в C ++
Экстраполируя на общий случай ленивых инициализированных глобалов, как описано в разделе FAQ, мы можем решить эту проблему следующим образом:
namespace B
{
class B { ... };
B& getInstance_Bglob;
{
static B instance_Bglob;
return instance_Bglob;;
}
B::~B()
{
A::getInstance_abc().doSomthing();
// The object abc is accessed from the destructor.
// Potential problem.
// You must guarantee that abc is destroyed after this object.
// To gurantee this you must make sure it is constructed first.
// To do this just access the object from the constructor.
}
B::B()
{
A::getInstance_abc();
// abc is now fully constructed.
// This means it was constructed before this object.
// This means it will be destroyed after this object.
// This means it is safe to use from the destructor.
}
}
namespace A
{
class A { ... };
A& getInstance_abc()
{
static A instance_abc;
return instance_abc;
}
}