2

我正在寻找一种方法来至少治愈我必须使用的泄漏 DLL 的症状。虽然库(OpenCascade)声称提供了一个内存管理器,但我还不能让它释放它分配的任何内存。

我至少希望将对该模块的调用放在“沙箱”中,以防止我的应用程序在 OCC 模块不再运行时不会丢失内存。

我的问题是:虽然我意识到这样做会是一个 UGLY HACK (TM),但是否可以预先分配一段内存供库专门使用,或者围绕它构建某种沙箱,这样我就可以跟踪他们使用了哪些内存区域以便在我完成后自己释放它们?

或者那会是丑陋的黑客,我应该尝试以其他方式解决问题?

4

3 回答 3

6

唯一可靠的方法是将库的使用分离到一个专用进程中。您将启动该过程,将数据和参数传递给它,运行库代码,检索结果。一旦您决定不再可以容忍内存消耗,您就重新启动该过程。

于 2010-07-05T14:15:35.317 回答
3

使用未损坏的库可能会容易得多,但如果没有可用的替代插件,您可以尝试拦截分配调用。如果库的“优化”不是太差(特别是函数内联),您可以反汇编它并找到 malloc 和 free 函数;在加载时,您可以将编码该地址的每 4 个(或 p64 系统上的 8 个)字节序列替换为指向您自己的内存分配器的字节序列。不过,这几乎可以保证是一个错误的、不可读的时间接收器,所以如果你能找到一个有效的替代品,请不要这样做。

编辑:

看到@sharptooth 的答案,它有更好的工作机会。不过,我仍然建议尝试寻找替代品。

于 2010-07-05T14:32:47.953 回答
1

你应该问问 Roman Lygin 的意见——他曾经在 occ 工作过。他至少有一篇文章提到了内存管理http://opencascade.blogspot.com/2009/06/developing-parallel-applications-with_23.html

如果你问得好,他甚至可能会写一篇解释 mmgt 内部结构的帖子。

于 2010-09-10T02:05:33.677 回答