gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:55:51 24 4
gpt4 key购买 nike

我有两个共享库: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;
}
}

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

我无法更改 loglib.c。

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

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

最佳答案

来自 gcc 文档:

You may provide an optional integer priority to control the order in which constructor and destructor functions are run. A constructor with a smaller priority number runs before a constructor with a larger priority number; the opposite relationship holds for destructors. So, if you have a constructor that allocates a resource and a destructor that deallocates the same resource, both functions typically have the same priority. The priorities for constructor and destructor functions are the same as those specified for namespace-scope C++ objects (see C++ Attributes).

你试过这个吗?

它不必是 mylib 的最高优先级,只要足够大即可。如果已记录,您的库的用户就可以信赖它。

关于c - 如何确保析构函数在其他库的析构函数之前被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11667022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com