【发布时间】:2010-03-01 17:59:52
【问题描述】:
这个问题是这个question.的后续问题
如何实现我的应用程序和我的运行时包使用相同的内存管理器?我认为这是默认情况下的情况,但由于我遇到奇怪的访问冲突和无效指针异常,我插入在进入运行时包之前和运行时包中调用GetMemoryManagerState,返回的状态似乎表明包和应用程序使用不同的内存管理器。
在调用runtime包中的方法之前,分配了61个介质块,调用之后(包内被调用方法的开头)分配了0个介质块。
你对此有什么解释吗?我该怎么做才能使包和应用程序共享内存管理器?使用 FastMM 时还有更复杂的问题吗?
编辑顺便说一句,有没有比比较内存管理器状态更好的方法来检查是否使用了相同的内存管理器? TMemoryManager 原来是记录,所以我无法比较地址。
【问题讨论】:
-
默认情况下会这样做。你用的是什么 Delphi 版本?
-
你如何加载包?动态还是不动态?应用程序是否使用“使用运行时包”编译?
-
...这似乎是我错的地方。打开此选项似乎可以解决问题。所以我猜只有当 RTL 被用作运行时包时,内存管理器才是共享的。对吗?
-
没错,粉碎者。 RTL 包是内存管理器所在的位置。如果您不共享 System 单元等,那么您就没有共享内存管理器。任何使用运行时包的程序都必须设置“使用运行时包”选项。您可以选择哪些运行时包被配置为使用,但其中一个包必须包含内存管理器,并且应用程序使用的所有其他包也必须需要该包。
-
如果你不使用运行时包,你仍然会遇到同样的问题,让你决定使用包。你甚至不需要制作你的插件包。它们仍然可以是 dll。您只需要在运行时包中拥有共享代码。或者至少是 RTL 和 VCL 代码。
标签: delphi memory-management packages