【问题标题】:dlopen and dlclose memory management in C applnC appln 中的 dlopen 和 dlclose 内存管理
【发布时间】: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


【解决方案1】:

dlclose 不会释放由malloc 分配的内存。它只释放库中声明的静态变量。您应该显式释放库中所有已分配的内存,可能在 _fini 函数中。

【讨论】:

    【解决方案2】:

    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() 并跟踪分配的内存。

    【讨论】:

    • 我的场景是循环调用 dlopen 和 dlclose
    • 仍然没有魔法。我猜你无法控制 lib1.so?如果他们没有链接自己的 malloc() 版本,您的选择可能是将 lib1.so 中的 malloc() 包装到带有垃圾收集的版本,或者使用您在退出时释放的分配内存管理一个列表。
    【解决方案3】:

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

    【讨论】:

    • 你也不能确定,这取决于操作系统。
    • @onemasse 嗯,这是一个基于 UNIX 的操作系统,因为他使用的是 dlopen() 等,所以我可以肯定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 2021-11-01
    • 2013-05-09
    • 2010-11-01
    • 1970-01-01
    相关资源
    最近更新 更多