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



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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新