【发布时间】:2011-12-18 19:11:04
【问题描述】:
我使用 dlopen 加载一个动态库,比如“lib1.so”并调用一个公开的函数,比如 A1, A1 函数使用 malloc 分配 100kb 的动态内存,但没有取消分配,在 main 函数中我再次全部 dlclose。 [dlopen,调用函数 A1,dlclose]
我重复这一步说 10 次,Purify 报告这是 1000KB 的内存泄漏 , valgrind 报告间接丢失了 1000KB。
您能否建议 100 KB * 10 次 = 1000KB ,是真正的内存泄漏吗? 正如我所说的 dlclose,所以为动态库分配的所有内存都会自动释放 当我们调用 dlclose 时?
操作系统:Linux 编程局域网:C
【问题讨论】:
-
没有看到任何代码,我猜你应该只为每个库调用一次 dlopen 。这会将库映射到进程生命周期内的进程内存空间。
-
没错,但我需要知道行为,应用程序可能会多次调用 dlopen / dlclose...
-
您基本上已经回答了自己的问题 - 行为是您对每个库调用 dlopen 一次或发生内存泄漏。我知道的唯一例外是(在 Solaris 中使用它)调用 exec 的情况,以及在设置了 FC_CLOEXEC 的 dlopen(句柄 == 文件描述符)的文件句柄上调用 fcntl() 的情况。调用后,子进程不再有打开的句柄。无需重复调用 dlopen。时期。你知道 dlsym() 来获取函数的入口点 - 你可以一遍又一遍地调用。
标签: c memory-management dll dynamic-linking dlopen