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

时间:2012-07-26 10:06:15

标签: c gcc

我有两个共享库: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的用户可能希望为自己的析构函数使用更高的优先级。

1 个答案:

答案 0 :(得分:1)

来自gcc文档:

  

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

你试过这个吗?

它不一定是mylib的最高优先级,只要足够大。如果有文档记录,您图书馆的用户可以依赖它。