我应该在主机应用程序和库的uses部分中都包含FastMM4吗?共享运行时包怎么办?
一些额外的信息:
- 我们有一个exe和20个以上的dll。每个人都共享一个单一的运行时包。
- 我们今天不使用sharemem。至少我不知道。快速查看今天检查过的exe或dll中都没有包含ShareMem。
- 我可以在所有项目中使用FastMM的inc文件中相同的选项,还是exe和dll需要不同的设置?
FastMM4options.inc
文件摘录。由于“每个人都在共享一个运行时包”,我建议使用我正在使用的方法。简单地将FastMM4添加到您的共享运行时包中(当然,您需要在每个库和主机应用程序中的“using”声明中放置FastMM4)。
这种方式有一些优点,例如:
简单的方法来开启/关闭FullDebugMode [和其他选项]。不需要重新编译项目,只需重新编译共享包即可在整个应用程序(包括dll)中切换FullDebugMode,因为FastMM仅被实例化一次。
没有版本问题。当您更新FastMM(一旦使用,它就成为整个应用程序和插件的关键组件)时,您不必再次构建整个构建(应用程序和插件)。再次更新共享包就足够了。
卸载插件时没有内存管理器问题。我曾经遇到过一些问题,当第一个插件库被卸载时,FastMM被卸载,从而导致应用程序关闭时出现大量错误。
没有跟踪问题-如果发生任何内存泄漏或其他内存问题,即使错误发生在DLL代码中,您也将获得有效的调用堆栈。
以下是我在FastMM4Options.inc中使用的(非标准)选项,以便按照上述描述使整个过程正常工作。
{$define NeverUninstall} {$define UseRuntimePackages} {.$define ShareMM}
我相信其余部分没有改变,但如果有什么问题,这里是完整的文件: http://pastebin.4programmers.net/693
我的观点是,除非您的应用程序与dll密切交互(即:在dll中具有表单和组件),否则最好的方法不是依赖于共享内存管理器,而是正确地管理内存,跟踪谁创建了什么并在实例化它们的同一库中删除对象。这并不难。只需返回接口而不是对象,返回shortstrings(固定长度)或将数据复制到提供的缓冲区中而不是返回字符串等。不要返回调用者将释放的内容,也不要接受调用方必须释放的内容,这样基本上就安全了。这不仅解决了所有可能的内存管理器问题,还可以让您使用任何语言编写dll。