Вызывается ли когда-нибудь `__cxa_finalize` с нулевым указателем на практике?C++

Программы на C++. Форум разработчиков
Anonymous
Вызывается ли когда-нибудь `__cxa_finalize` с нулевым указателем на практике?

Сообщение Anonymous »

Программа 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) вызывается на практике?

Временное дополнение перед переписыванием вопроса или ответа:
Кажется, ситуация более запутанная, чем я предполагал. Если библиотека деинициализируется как часть выхода(), то __run_exit_handlers() уничтожает ее локальную для функции статику. При этом обработчики выхода повторяются в порядке, обратном их регистрации, независимо от границ разделяемой библиотеки.
Если, тем не менее, вы выполняете dlclose() библиотеку, то вызывается _dl_call_fini(), который вызывает __do_global_dtors_aux(), который вызывает __cxa_finalize(), который уничтожает локальную для функции статику per библиотека.
В первом случае (без dlclose()) __cxa_finalize() также вызывается как часть __run_exit_handlers, но позже - только после того, как локальная для функции статика уже уничтожена.

Подробнее здесь: https://stackoverflow.com/questions/798 ... n-practice

Вернуться в «C++»