Ответ 1
ОБНОВЛЕНИЕ: OP сделал некоторую путаницу, и кажется, что VC11 действительно ведет себя так, как это определено стандартом С++ 11. Следующий ответ был написан в предположении, что он этого не сделал.
Поэтому ответ на этот вопрос:
Я уверен, что
onExit
всегда вызывается перед уничтожением глобального объекта (например,g_class
)?
Является "Да" , если вы работаете с полностью совместимым компилятором.
Я обнаружил, что
MyClass::~MyClass()
вызывается передonExit()
в Visual Studio 2012.
Если это так, то это ошибка в VC11. В пункте 3.6.3/1 стандарта С++ 11:
Деструкторы (12.4) для инициализированных объектов (т.е. объекты, чье жизненное время (3.8) началось) со статическим хранилищем длительность вызывается в результате возврата из
main
и в результате вызоваstd::exit
(18.5). [...]
Кроме того, в пункте 3.6.3/3:
Если завершение инициализации объекта со статической продолжительностью хранения секвенируется перед вызовом до
std::atexit
(см.<cstdlib>
, 18.5), вызов функции, переданной вstd::atexit
, секвенирован перед вызовом деструктора для объекта.
Следовательно, в вашем случае перед деструктором MyClass
следует вызвать onExit()
.
Насколько я могу судить, Clang 3.2 и GCC 4.8.0 совместимы в этом отношении, как показано в этом живом примере.