首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FastMM和动态加载DLL

FastMM和动态加载DLL
EN

Stack Overflow用户
提问于 2010-06-07 12:10:07
回答 6查看 4.7K关注 0票数 3

我有一个主机应用程序,它在启动时加载十几个库。我想从Delphi7s的默认内存管理器切换到FastMM4的完整版本,以获得更好的mem泄漏报告。

我应该在主机应用程序和库的“使用”部分中包括FastMM4吗?共享运行时包呢?

一些补充资料:

  • 我们有一个exe和>20个dll。每个人都共享一个运行时包。
  • 我们今天不使用sharemem。据我所知没有。ShareMem不包括在一起的exe或dll,我今天快速查看了它们。

补充问题:

  • 可以在所有项目中使用
  • 文件中的相同选项吗?
EN

回答 6

Stack Overflow用户

发布于 2010-06-07 12:34:07

摘自FastMM4options.inc文件。

对我来说,这意味着如果您的所有包、dll和可执行文件都是用ShareMM编译的,那么应该可以替换Delphi7s的默认内存管理器。

{

{允许使用FastMM编译的主应用程序和DLL之间共享内存管理器。这允许您将动态数组和长字符串传递给DLL函数,这两个函数都是编译后使用FastMM的。只有当使用"AttemptToUseSharedMM“选项集编译了本应共享内存管理器的库时,共享才能工作。注意,如果主应用程序是单线程的,而DLL是多线程的,则必须将主应用程序中的IsMultiThread变量设置为true,否则当线程争用发生时,它会崩溃。请注意,静态链接的DLL文件是在主应用程序之前初始化的,因此主应用程序很可能最终共享静态加载的DLL的内存管理器,而不是相反。}

{.$define ShareMM}

{允许由DLL与其他DLL共享内存管理器(如果这是静态加载的DLL,则允许共享主应用程序),这些DLL也是用FastMM编译的。在动态加载的DLL中小心设置此选项,因为如果正在共享其MM的DLL被卸载,而任何其他DLL仍在共享MM,则应用程序将崩溃。此设置仅适用于DLL库,并要求将ShareMM设置为具有任何效果。只有当使用"AttemptToUseSharedMM“选项集编译了本应共享内存管理器的库时,共享才能工作。注意,如果DLL是静态链接的,那么它们将在主应用程序之前初始化,然后DLL实际上将与主应用程序共享它的MM。除非还设置了ShareMM,否则此选项无效。}

{.$define ShareMMIfLibrary}

{将此定义为尝试在使用ShareMM集编译的进程中共享主应用程序的MM或其他加载的DLL。共享内存管理器时,共享程序造成的内存泄漏不会自动释放。考虑到静态链接DLL是在主应用程序之前初始化的,因此相应地设置共享选项。

{.$define AttemptToUseSharedMM}

{将此定义为支持Delphi2006和2007使用的内存管理器共享机制以及旧版本的FastMM版本的向后兼容性。}

{ EnableBackwardCompatibleMMSharing} {$define

票数 8
EN

Stack Overflow用户

发布于 2010-06-07 12:34:26

你要找的是SimpleShareMem。它包含在FastMM包中。确保您的应用程序和您的DLL都在使用它,以及它们的FastMM4顶部的使用子句。这可以确保它们共享相同的堆,而不是使用单独的堆。

当然,只有在应用程序和库(例如字符串或对象)之间传递动态内存时,共享内存才是必要的。如果不需要,那么您不需要SimpleShareMem,但我仍然建议将库切换到FastMM作为内存管理器,以提高性能和提高稳定性。

票数 3
EN

Stack Overflow用户

发布于 2010-06-09 11:00:18

因为“每个人都共享一个运行时包”。我会推荐我正在使用的方法。简单地说,将FastMM4添加到您的共享运行时包(当然,您需要在每个库和宿主应用程序中的“使用”声明中添加FastMM4 )。这种方式有一些优点,例如:

当然,

  • 简单的方法可以打开/关闭FullDebugMode和其他选项。不需要重新编译项目,仅重新编译共享包就足以在整个应用程序(包括dll)中切换FullDebugMode,因为FastMM只运行一次。
  • 没有版本控制问题。当您更新FastMM (一旦使用它就成为整个应用程序和插件的关键组件)时,您就不必再发布整个构建(app & plugins)了。再一次,更新共享包就足够了。
  • 在卸载插件时没有内存管理器问题。在卸载第一个插件库之后,我在卸载FastMM时遇到了一些问题,因此在应用程序关闭时导致了大量的bug。
  • 没有跟踪问题--如果有任何内存泄漏或其他内存问题,将为您提供有效的调用堆栈,即使错误发生在DLL代码中。

下面是我在我的FastMM4Options.inc中使用的(非标准的)选项,以使整个事情像上面所描述的那样正常工作。

{$define NeverUninstall} {$define UseRuntimePackages} {.$define ShareMM}

好吧,我相信其余的都没有改变,但是如果有什么问题,下面是完整的文件:http://pastebin.4programmers.net/693

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2989289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档