首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__cxa_atexit()和atexit()之间有什么区别?

__cxa_atexit()和atexit()之间有什么区别?
EN

Stack Overflow用户
提问于 2017-03-20 19:09:49
回答 1查看 10.1K关注 0票数 10

GCC博士中,我找到了-fuse-cxa-atexit选项,它说:

此选项是完全符合标准的静态析构函数处理所必需的。

那这两者有什么区别呢?在__cxa_atexit的docs中,我发现了以下内容:

__cxa_atexit()函数用于实现atexit()

我在函数中实现静力学(不要问为什么),我想知道在调用析构函数时使用的是哪一个。

我想我只为MSVC准备了atexit()?这有问题吗?

我可以在任何地方使用atexit()并确保它的行为就像函数中的真实静态对象一样吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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()上运行析构函数。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42912038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档