假设我有一个共享库文件(比如libtemp.so),它有一个全局变量。如果我动态加载这个库,请为它分配一个堆内存,然后关闭该库。如果我再次加载库,那么旧堆内存是否泄漏?(我认为这是真的,因为当库再次加载时,全局变量将被重置)
将堆内存分配给全局变量是不是一种糟糕的做法?有没有什么情况下我们最终不得不这样做?
在Linux上,库全局变量位于共享对象的某个数据段中,当dlclose
初始化libtemp.so
时,该段将被munmap
重新初始化,并且在下一个dlopen
时将再次被mmap
重新初始化,因此全局将被重新初始化。
(我假设你只做一个dlopen
,即libtemp.so
不是两次dlopen
)
顺便说一句,您可以在构造函数中进行初始化(在析构函数中完成),请参阅GCC中的函数属性。构造函数在dlopen
时间执行,析构函数在dlclose
时间执行。有关详细信息,请参阅Linux dlopen(3)手册页。(注意POSIX dlopen没有这些技巧)
卸载和重新加载库是否会重置全局变量取决于实现。无论如何,拥有任何全局变量都是不好的做法,尤其是在共享库中。您所说的这类事情最常见的用例是在初始化时计算全局表。相反,您应该将它们替换为存储在二进制文件中的static const
表。