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