假设我有一个共享库文件(比如libtemp.so),它有一个全局变量。如果我动态加载此库,请为其分配堆内存,然后关闭库。如果我再次加载库,那么旧堆内存是否已泄露? (我认为这是真的,因为全局变量将在重新加载库时重置)
将堆内存分配给全局变量是不好的做法?在任何情况下我们最终都必须这样做吗?
答案 0 :(得分:2)
在Linux上,库全局变量位于共享对象的某个数据段中,当munmap
dlclose
时,该段将为libtemp.so
。已经mmap
- 在下一个dlopen
再次编辑,以便全局重新初始化。
(我假设你只做了一个dlopen
,即libtemp.so
不是dlopen
- 两次)
BTW,您可以在构造函数中进行初始化(并在析构函数中完成),请参阅GCC中的function attributes。构造函数在dlopen
时执行,析构函数在dlclose
时执行。另请阅读Linux dlopen(3)手册页以获取详细信息。 (请注意,POSIX dlopen没有这些技巧)
答案 1 :(得分:1)
是否特定于实现是否卸载和重新加载库将重置全局变量。无论如何,任何全局变量都是不好的做法,尤其是在共享库中。您正在讨论的最常见的用例是拥有在初始化时计算的全局表。相反,您应该使用存储在二进制文件中的static const
表替换它们。