4

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

我添加了类似的东西:

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

4

2 回答 2

2

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

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

然而,在我使用 gcc-4.7.0 的测试中,构造函数在 C++ 全局对象构造函数之前运行,而在 C++ 全局对象析构函数之后的析构函数运行,无论声明/定义的顺序如何,两者都在同一个翻译单元中。

更新: Ian Lance Taylor 报告未指定具有构造函数属性和 C++ 全局构造函数的函数的执行顺序。见http://gcc.gnu.org/ml/gcc-help/2012-05/msg00118.html

在 C++ 中,您可以确保某个对象在任何其他全局对象之前被初始化,并在多个翻译单元中使用Schwarz Counter习惯用法被销毁。

于 2012-05-17T14:27:34.637 回答
0

当主程序加载/卸载这个库时,我想采取一些措施。

考虑使用静态类实例来做到这一点,它会更加干净和便携。

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

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

于 2012-05-18T17:13:45.390 回答