在GCC博士中,我找到了-fuse-cxa-atexit选项,它说:
此选项是完全符合标准的静态析构函数处理所必需的。
那这两者有什么区别呢?在__cxa_atexit的docs中,我发现了以下内容:
__cxa_atexit()函数用于实现atexit()
我在函数中实现静力学(不要问为什么),我想知道在调用析构函数时使用的是哪一个。
我想我只为MSVC准备了atexit()?这有问题吗?
我可以在任何地方使用atexit()并确保它的行为就像函数中的真实静态对象一样吗?
发布于 2017-03-20 19:26:44
__cxa_atexit()是在Itanium C++ ABI中定义的。这份文件解释了这一职能背后的动机
C++标准要求,当程序以相反的构造顺序退出时,必须为全局对象调用析构函数。大多数实现都通过调用C库
atexit例程来注册析构函数来处理这个问题。这是有问题的,因为1999年C标准只要求实现支持32个已注册的函数,尽管大多数实现支持更多的功能。更重要的是,在大多数实现中,通过在程序终止前调用dlclose从运行中的程序映像中删除动态共享对象的能力完全没有。 下面指定的API旨在在正常程序退出期间提供符合标准的处理,包括相对于构造函数注册的析构函数以正确的顺序执行atexit-registered函数,以及在早期DSO卸载期间的合理处理(例如dlclose)。
所以:
__cxa_atexit()不限于32个函数。__cxa_atexit()将调用动态库的静态析构函数。如果您正在编写库,并且您的libc具有此函数(例如glibc、musl),则应该启用-fuse-cxa-atexit。实际上,您的发行版附带的gcc可能已经自动启用了此标志(如果启用该标志,而libc不支持它,则会出现链接器错误)。
注意,直接:它接受只有编译器/链接器应该知道的参数(__dso_handle)。
…不支持
__cxa_atexit的用户界面,因此用户无法用参数或主DSO注册atexit函数。
MSVC显然是运行全局析构函数的-like函数。根据不调用共享库中全局静态变量的析构函数。的说法,MSVC已经在dlclose()上运行析构函数。
https://stackoverflow.com/questions/42912038
复制相似问题