После вызова деструктора небезопасно вызывать методы объекта.
Вопрос в том, как контролировать порядок уничтожения объектов.Статика уничтожается в обратном порядке инициализации, поэтому my_error_category_type будет уничтожен до MyObj, потому что его конструктор вызывается после конструктора MyObj.Это не проблема, которую нужно решать стандартно, а скорее архитектурная проблема.
Итак, мы должны каким-то образом контролировать порядок уничтожения.Самый простой способ - убедиться, что деструктор obj
вызывается раньше:
void F() {
MyObj obj;
obj.method();
}
int main() {
F();
}
Вывод программы:
name:1
Running cleanup
name:2
Destroyed the category
Теперь деструктор MyObj
вызывается раньше, не после main, нопосле F()
end, потому что MyObj
- это переменная области видимости, и она уничтожается после F()
finish и static my_error_category_type c
при завершении main.
Но если мы все еще хотим сделать MyObj статическим, естьтакая техника называется Nifty Counter Idiom , которая помогает разрушать статику только после последнего использования.Но у него есть свои компромиссы. ссылка
Аналогичная проблема со статикой: «фиаско статического порядка инициализации» ( ссылка ).