我必须使用共享库中的一个函数来泄漏少量内存(让我们假设我无法修改库)。不幸的是,我必须多次调用此函数,这显然会使这次泄漏变得灾难性。
有什么方法可以解决这个问题吗?如果是的话,有没有一种快速的方法呢? (该功能必须被调用几十万次,大约10k次后泄漏就会出现问题)
答案 0 :(得分:4)
我可以想到几种方法,但我不知道什么对你有用。
切换到像Boehm's gc这样的垃圾收集内存分配器。这可以清除这些泄漏,甚至可能是性能提升,因为free()
变为无操作。
exit()
:终极解除分配器。分离子进程,运行10k次,将结果传递回父进程。 Apache的Web服务器执行此操作以包含来自第三方库泄漏的损坏。
答案 1 :(得分:3)
我不确定这比自己重写函数更容易,但你可以编写自己的特定于你的任务的小内存分配器,这看起来有点如下:
(它应该替换默认的内存分配调用,这也适用于库中的函数)。
1)您应该有可能进入泄漏还原模式,例如,处理在此模式下分配的所有内容。
2)在您的功能处理之前,输入泄漏还原模式并在功能完成后退出。
基本上,如果代码中的依赖关系不是太紧,这会有所帮助。
另一种方法是制作另一个应用程序并将其与主要配对。当第二个退出时,存储器将自动处理。 您可能想看看googletest
框架如何运行它的子测试以及如何在那里构建管道。
答案 2 :(得分:0)
简而言之,没有。如果你有时间,你可以自己重写这个功能。灾难性通常意味着这是要走的路。另一种可能性,你可以加载和卸载库(如.so)吗?这可能会释放泄露的内存。