【发布时间】:2014-08-28 00:36:00
【问题描述】:
使用__attribute__((constructor)) 和__attribute__((destructor)) 定义的GCC 共享库构造函数和析构函数是否保证只运行一次?该文档似乎暗示它们将至少运行一次,但没有提到任何关于不止一次的内容。
换句话说,如果我在构造函数中做了一个只能执行一次的操作,我是否需要像这样保护它:
static gboolean constructor_has_run = FALSE;
if(!constructor_has_run) {
do_operation();
constructor_has_run = TRUE;
}
【问题讨论】:
-
在实践中,我认为这总是可以保证的,但如果 GCC 能更好地记录这一点,那就太好了。
-
是 - 构造函数在 main() 之前调用一次,析构函数在之后调用一次。
-
在简单的情况下很明显,但在
dlopen情况下就变得不那么简单了。 -
它被称为“构造函数”,而不是“被称为未指定正数的函数”。后者不是构造函数通常所做的。意图一清二楚。如果您认为应该在文档中明确提及,请针对文档提交错误。
-
@n.m.:加载一个库而不先卸载它是合法的。在 Windows 下,每次加载库时,为每个线程调用一次
DLLMain。_init保证在 Linux 下只被调用一次,但不一定对每个系统都如此。尽管如此,在 GCC 下,构造函数(分别从DLLMain和_init调用)只运行一次。无论你做什么,无论我尝试过什么系统。
标签: c gcc shared-libraries