首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >__cxa_finalize和__attribute__

__cxa_finalize和__attribute__
EN

Stack Overflow用户
提问于 2012-05-17 11:21:40
回答 2查看 6K关注 0票数 4

据我所知,一个程序(在Linux中使用C++编写)在退出主函数时调用__cxa_finalize。我创建一个共享库,并在主函数中使用这个库。我想在主程序加载/卸载这个库时采取一些操作。我发现在创建共享库时,函数__attribute__可以用于这个目的(这个函数应该在共享库代码中实现)

我加了一句:

代码语言:javascript
运行
复制
void __attribute__ ((constructor)) my_load(void);

void __attribute__ ((destructor)) my_unload(void);

我实现了my_load和my_unload函数,如下所示:http://tdistler.com/2007/10/05/implementing-dllmain-in-a-linux-shared-library

问题是,当退出主函数?my_unload()函数还是__cxa_finalize函数时,这些函数的处理顺序是什么?

EN

回答 2

Stack Overflow用户

发布于 2012-05-17 14:27:34

构造器/析构器属性的gcc文档说:

您可以提供一个可选的整数优先级来控制运行构造函数和析构函数的顺序。优先级较小的构造函数在优先级较大的构造函数之前运行;对于析构函数,则相反的关系成立。因此,如果您有一个分配资源的构造函数和一个释放相同资源的析构函数,则这两个函数通常具有相同的优先级。构造函数和析构函数的优先级与为命名空间作用域C++对象指定的优先级相同.

然而,在我使用gcc-4.7.0进行的测试中,构造函数运行在C++全局对象构造函数之前,而析构函数在C++全局对象析构函数之后运行,而两者处于相同的转换单元中,而不管声明/定义的顺序如何。

更新: Ian报告没有指定带有构造函数属性和C++全局构造函数的函数的执行顺序。请参阅http://gcc.gnu.org/ml/gcc-help/2012-05/msg00118.html

在C++中,可以确保某些对象在任何其他全局对象之前被初始化,并在使用施瓦兹计数器成语后在多个翻译单元中被销毁。

票数 2
EN

Stack Overflow用户

发布于 2012-05-18 17:13:45

我想在主程序加载/卸载这个库时采取一些操作。

考虑使用静态类实例来实现这一点,它将更加干净和可移植。

基本上,您编写了一个类,它在其构造函数中执行初始化工作(并在析构函数中完成),然后声明该类的静态实例。然后动态链接器为你做所有的事情。

LLVM有一个很好的类模板,它使用这种技术自动管理插件注册中心,我建议您向它学习。

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

https://stackoverflow.com/questions/10634767

复制
相关文章

相似问题

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