我使用dlopen加载一个动态库说“lib1.so”并调用一个暴露函数说A1, A1函数使用malloc分配一个100kb的动态内存,但是没有释放,在main函数中我再次dlclose。 [dlopen,调用函数A1,dlclose]
我重复这个步骤10次,Purify报告这是1000KB的内存泄漏 ,valgrind报告间接丢失了1000KB。
请你建议100 KB * 10次= 1000KB,是真的内存泄漏吗? 因为我已经调用了dlclose,所以为动态库分配的所有内存都是自动释放的 当我们打电话给dlclose?
操作系统:Linux 编程lan:C
答案 0 :(得分:5)
dlclose
不释放用malloc
分配的内存。它只释放库中声明的静态变量。您应该在库中明确释放任何已分配的内存,可能在_fini
函数中。
答案 1 :(得分:3)
dlclose的手册页没有说明在调用内存时释放内存。
dlclose()
The function dlclose() decrements the reference count on the dynamic
library handle handle. If the reference count drops to zero and no
other loaded libraries use symbols in it, then the dynamic library is
unloaded.
The function dlclose() returns 0 on success, and nonzero on error.
没有魔力。
如果你正在使用linux,你可以尝试this method来包装malloc()并跟踪分配的内存。
答案 2 :(得分:2)
不,当进程终止时回收内存,而不是在动态库关闭时回收。