我必须使用共享库中的一个函数,这个函数会泄漏一些less量的内存(让我们假设我不能修改这个库)。 不幸的是,我不得不把这个函数调用很多次,这显然使这个泄漏是灾难性的。
有什么方法可以解决这个问题吗? 如果是的话,是否有一个快速的方法来做到这一点? (function要调用几十万次,约10K次后泄漏就成问题了)
我可以想到几个方法,但是我不知道什么会适合你。
切换到像Boehm's gc这样的垃圾收集内存分配器。 这可以清除这些泄漏,甚至可能是一个性能增益,因为free()
变成了no-op。
exit()
:终极释放器。 分叉一个子进程,运行10k次,将结果传递回父进程。 Apache的Web服务器这样做是为了防止第三方库泄漏造成的损害。
我不确定这比自己重写这个函数更容易,但是你可以编写你自己的小内存分配器,这个内存分配器特定于你的任务,看起来有点像下面这样:
(它应该取代默认的内存分配调用,这也是为你的库中的函数完成的)。
1)您应该有可能进入泄漏恢复模式 ,例如,处理在此模式下分配的所有内容。
2)在函数处理之前,进入该回漏模式并在函数结束时退出。
基本上,如果你的代码中的依赖不是太紧,这将有所帮助。
另一种方法是制作另一个应用程序,并与主要配对。 当第二个退出时,内存将被自动处理。 您可能想要了解googletest
框架如何运行它的子测试以及如何在这里构建管道。
总之,没有。 如果你有时间,你可以自己重写这个函数。 灾难通常意味着这是要走的路。 另一种可能性,你可以加载和卸载库(如.so)? 这可能会释放泄漏的内存。