任何强迫的方式;dlclose();释放内存?

任何强迫的方式;dlclose();释放内存?,c,C,我的应用程序处理数千条消息,并在运行时使用dlopen/dlclose等调用共享库中的函数 我一直在运行时分析内存,似乎(正如我所预料的)dlclose()在关闭后不会释放任何malloc'ed内存。所以我有一个相当严重的内存泄漏 问题是这些共享库是由其他人编写的,我不允许更改源代码。这有什么办法吗?我想我可以调用一个“子进程”来处理消息,然后当消息终止时,该子进程的内存将消失 还有其他想法吗 谢谢你的帮助 Lynton我相信是共享库分配的内存,您正在删除它,而您没有简单的方法删除它(因为您不知

我的应用程序处理数千条消息,并在运行时使用dlopen/dlclose等调用共享库中的函数

我一直在运行时分析内存,似乎(正如我所预料的)dlclose()在关闭后不会释放任何malloc'ed内存。所以我有一个相当严重的内存泄漏

问题是这些共享库是由其他人编写的,我不允许更改源代码。这有什么办法吗?我想我可以调用一个“子进程”来处理消息,然后当消息终止时,该子进程的内存将消失

还有其他想法吗

谢谢你的帮助


Lynton

我相信是共享库分配的内存,您正在删除它,而您没有简单的方法删除它(因为您不知道您的流程的其他部分,例如,哪些其他DLED库正在使用它)。如果你想了解更多,就读一本关于这方面的好书,或者至少是这方面的书。对进程有用的内存是整个进程的全局属性,而不是特定库的全局属性

但是,有些库有关于内存使用的约定,可能会为您提供清理内存和资源的功能。其他库不发布资源。 有些库允许您将它们调用的分配例程作为参数

<>你可以考虑使用或使用类似的工具来追踪漏洞。

祝你好运,因为你的问题没有解决的办法。也许告诉我们更多关于您正在打开的实际库的信息可能会有所帮助


当然,还需要不时重新启动进程。

不,任何分配的内存都属于进程,而不是库。换句话说,dlclose无法知道要关闭的库分配了哪些内存。任何行为良好的库都应该提供清理功能,或者永远不要分配未返回给您的内存。但并非所有库都表现良好…

从您的问题中不清楚“泄漏”的内存是由您加载的库分配的内存,还是由
dlopen
实现作为管理加载库的一部分分配的内存

如果它是由库分配的,那么要么您误用了库,没有调用正确的函数来指示它释放分配的内存,要么它写得不好,分配得不好(可能在第一次使用时),它计划保留、重用并且永远不会释放数据

如果它是通过
dlopen
的实现分配的,那么就没有什么问题;这仅仅意味着
dlopen
决定它无法安全地卸载库,可能是因为仍然有一些对其符号的引用。这没有问题,因为将来加载同一个库不会消耗更多内存,而是会重用已加载的副本


现在,假设问题不是您误用了库,所有问题都应该可以解决,只要保持库处于打开状态,不调用
dlclose
,并在下次需要时自己重用它即可。这样,即使库在你背后分配了内存并且没有办法释放它,这种情况只会发生一次(第一次加载库时),而不是“N次”,因此它不是“内存泄漏”。

这是什么库?也许你应该自己释放库中函数返回的内存。你是如何测量的?许多
malloc
实现实际上不会取消虚拟内存的映射并将其返回到操作系统,即使在虚拟内存被正确地
free()释放之后也是如此。风险自负。先阅读手册。您可以通过对.so文件运行“readelf-Ws”并对STB_GNU_UNIQUE进行grepping来检查这是否是问题所在。这可能会破坏某种单例行为,并可能杀死您的程序并使其出现故障。通常,它是一些C++模板或内嵌静态的东西,这是产生这种情况的原因。请看我的答案:“不是所有的图书馆都是行为良好的”。嗨,我觉得这是一个写得很差的共享库。谢谢你的评论,非常感谢。