我正在寻找一种方法来治愈至少我必须使用的漏洞DLL的症状。虽然库(OpenCascade)声称提供了一个内存管理器,但我还是无法释放它分配的任何内存。
我至少希望将这个模块的调用放在'沙箱'中,以便在OCC模块不再运行时保持我的应用程序不会丢失内存。
我的问题是:虽然我意识到这将是一个UGLY HACK(TM),但是是否可以预先分配一段内存以供库特别使用,或者在它周围构建某种沙盒所以我可以跟踪他们使用的记忆区域,以便在我结束时自己释放它们?
或者那是丑陋的黑客,我应该尝试解决问题呢?
答案 0 :(得分:6)
唯一可靠的方法是将库的使用分成专用的过程。您将启动该过程,将数据和参数传递给它,运行库代码,检索结果。一旦确定不再容许内存消耗,就可以重新启动该过程。
答案 1 :(得分:3)
使用未破坏的库可能会容易得多,但如果替换不可用,您可以尝试拦截分配调用。如果库没有太“优化”(特别是函数内联),你可以反汇编它并找到malloc和free函数;在加载时,你可以用一个指向你自己的内存分配器的字节序列替换每个编码该地址的4(或8个p64系统)字节序列。这几乎可以保证是一个有缺陷的,不可读的时间段,所以如果你找到一个可以替代的工作,就不要这样做。
看到@ sharptooth的答案,它有更好的工作机会。我仍然建议尝试寻找替代品。
答案 2 :(得分:1)
你应该问Roman Lygin的意见 - 他曾经在occ工作过。他至少有一篇提到记忆管理的帖子http://opencascade.blogspot.com/2009/06/developing-parallel-applications-with_23.html。
如果你问得很好,他甚至可能会写一篇解释mmgt's internals的帖子。