1

假设我有一个共享库文件(比如 libtemp.so),它有一个全局变量。如果我动态加载这个库,给它分配一个堆内存,然后关闭这个库。如果我再次加载库,那么旧堆内存是否泄漏?(我认为这是真的,因为再次加载库时全局变量将被重置)

将堆内存分配给全局变量是一种不好的做法吗?有没有我们最终不得不这样做的情况?

4

2 回答 2

2

在 Linux 上,库全局变量位于共享对象的某个数据段中,并且该段munmapdlclose-ing时会被 -edlibtemp.so并且会mmap在下一次被 -ed 时再次被 -ed,dlopen因此全局将被重新初始化。

(我假设你只做一个dlopen,即libtemp.so不是dlopen-ed 两次)

顺便说一句,您可以在构造函数中进行初始化(并在析构函数中完成),请参阅GCC 中的函数属性。构造函数在dlopen时间执行,而析构函数在dlclose时间执行。另请阅读 Linux dlopen(3)手册页了解详细信息。(注意 POSIX dlopen没有这些技巧)

于 2012-08-01T05:32:28.707 回答
1

卸载和重新加载库是否会重置全局变量是特定于实现的。无论如何,拥有任何全局变量都是不好的做法,尤其是在共享库中。对于您正在谈论的事情,最常见的用例是在初始化时计算全局表。相反,您应该将它们替换为static const存储在二进制文件中的表。

于 2012-08-01T05:23:28.083 回答