0

我有两个共享库:mylib 和 loglib(名称已更改)。两者都有析构函数(gcc 的扩展)。mylib 的析构函数需要loglib 的函数。这边走:

来自 libmy.so 的 mylib.c:

void __attribute__ ((destructor)) mylib_destructor()
{
    loglib_write_log("destructor");
}

来自 liblog.so 的 loglib.c:

void loglib_write_log( const char* txt )
{
   fprintf( log_file, "%s\n", txt );
}

void __attribute__ ((destructor)) loglib_destructor()
{
    if( log_file )
    {
        fclose( log_file );
        log_file = NULL;
    } 
}

如您所见,如果loglib_destructor()在之前调用会出现问题mylib_destructor(): fprintf 将获得 NULL 指针参数。

我无法更改 loglib.c。

如何确保mylib_destructor在其他库的析构函数之前调用它?

我不想为 设置最高优先级mylib_destructor,因为 mylib 的用户可能希望为自己的析构函数使用更高的优先级。

4

1 回答 1

1

gcc文档:

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

你试过这个吗?

它不必是 的最高优先级mylib,只要足够大即可。如果它被记录在案,你的图书馆的用户可以依赖它。

于 2012-07-26T10:14:17.987 回答