在C appln中进行dlopen和dlclose内存管理

时间:2011-10-31 14:30:32

标签: c memory-management dll dynamic-linking dlopen

我使用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

3 个答案:

答案 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)

不,当进程终止时回收内存,而不是在动态库关闭时回收。