Программа C++, созданная с помощью GCC, обычно вызывает __cxa_finalize для каждой разделяемой библиотеки в порядке, обратном инициализации, например, при выходе из программы, чтобы уничтожить глобальные переменные и статические локальные функции. Предоставление аргумента __dso_handle гарантирует, например, что локальная статика функции будет уничтожена для каждой общей библиотеки. (Это немного удивительно, поскольку они уничтожаются только в обратном порядке инициализации внутри одной библиотеки, но не в общих библиотеках.)
https://elixir.bootlin.com/glibc/glibc- ... lize.c#L44
Код: Выделить всё
[...] GCC
calls the glibc variant directly from its CRT files, from an ELF
destructor. this call always passes a non-null D argument.
[...]
ABI Itanium C++ также предлагает возможность вызова __cxa_finalize(nullptr), который очищает все глобальные переменные и локальную для функции статику. Для статики, локальной для функции, это приведет к другому порядку уничтожения, поскольку теперь они будут уничтожаться в порядке, обратном инициализации, даже в общих библиотеках.
Меня немного беспокоят два разных порядка уничтожения. Есть ли случаи, когда на практике вызывается __cxa_finalize(nullptr)?
Подробнее здесь:
https://stackoverflow.com/questions/798 ... n-practice