我有一个主机应用程序,它在启动时加载十几个库。我想从Delphi7s的默认内存管理器切换到FastMM4的完整版本,以获得更好的mem泄漏报告。
我应该在主机应用程序和库的“使用”部分中包括FastMM4吗?共享运行时包呢?
一些补充资料:
补充问题:
发布于 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
发布于 2010-06-07 12:34:26
你要找的是SimpleShareMem。它包含在FastMM包中。确保您的应用程序和您的DLL都在使用它,以及它们的FastMM4顶部的使用子句。这可以确保它们共享相同的堆,而不是使用单独的堆。
当然,只有在应用程序和库(例如字符串或对象)之间传递动态内存时,共享内存才是必要的。如果不需要,那么您不需要SimpleShareMem,但我仍然建议将库切换到FastMM作为内存管理器,以提高性能和提高稳定性。
发布于 2010-06-09 11:00:18
因为“每个人都共享一个运行时包”。我会推荐我正在使用的方法。简单地说,将FastMM4添加到您的共享运行时包(当然,您需要在每个库和宿主应用程序中的“使用”声明中添加FastMM4 )。这种方式有一些优点,例如:
当然,
下面是我在我的FastMM4Options.inc中使用的(非标准的)选项,以使整个事情像上面所描述的那样正常工作。
{$define NeverUninstall} {$define UseRuntimePackages} {.$define ShareMM}
好吧,我相信其余的都没有改变,但是如果有什么问题,下面是完整的文件:http://pastebin.4programmers.net/693
https://stackoverflow.com/questions/2989289
复制相似问题