C - 将堆内存分配给全局变量

时间:2012-08-01 05:17:47

标签: c memory-leaks global-variables

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

将堆内存分配给全局变量是不好的做法?在任何情况下我们最终都必须这样做吗?

2 个答案:

答案 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表替换它们。