atexit
функций вызываются при выходе из программы в обратном порядке. На этом этапе также вызываются локальные деструкторы объекта stati c. Итак, в этом примере:
void f()
{
static X x;
atexit(f1);
static Y y;
}
При первом вызове x
и y
деструкторы будут зарегистрированы для вызова при выходе из программы, а f1()
будет вызываться между y.Y::~Y()
и x.X::~X()
.
Итак, если вы создаете коллекцию из std::function
объектов, которые будут вызываться при уничтожении коллекции, это может быть жизнеспособным обходным путем.
Это все еще может не работать для нескольких функций, поскольку все будут вызываться в одном l oop, а не в порядке LIFO относительно другого вызова stati c destructor / atexit.
Другим вариантом может быть просмотр at_thread_exit
. Он имеет другое семанти c, но может также соответствовать вашим потребностям.
Thunk, упомянутый @Remy Lebeau, может быть лучшим решением. Но реализовать это может быть нетривиально, поэтому я предлагаю рассмотреть и другие обходные пути.