Delphi 包内存管理

Delphi 包内存管理,delphi,memory-management,packages,Delphi,Memory Management,Packages,因为我在尝试使用DLL时遇到了很多困难,所以我决定尝试运行时包(主要是为了避免内存管理器和类型注册表问题) 在我的应用程序中,我执行以下操作: HandleList := TList <THandle>.Create; try PackageObj.DoSomething (HandleList); finally FreeAndNil (HandleList); end; HandleList:=TList.Create; 尝试 包装材料(手工列表); 最后 FreeAn

因为我在尝试使用DLL时遇到了很多困难,所以我决定尝试运行时包(主要是为了避免内存管理器和类型注册表问题)

在我的应用程序中,我执行以下操作:

HandleList := TList <THandle>.Create;
try
  PackageObj.DoSomething (HandleList);
finally
  FreeAndNil (HandleList);
end;
HandleList:=TList.Create;
尝试
包装材料(手工列表);
最后
FreeAndNil(手语列表);
结束;
该方法(在运行时包中)只是向列表中添加了一些内容:

procedure TPackageObject.DoSomething (HandleList: TList <THandle>);
begin
  HandleList.Clear;
  HandleList.Add (0);
end;
程序TPackageObject.DoSomething(HandleList:TList);
开始
手持列表。清晰;
添加(0);
结束;
在包中调用
Clear
或在应用程序中调用
FreeAndNil
时,我确实会遇到
无效指针
异常。访问冲突也不时发生

使用FastMM时,它有时会报告“块头已损坏”

当分配或释放内存时,即在列表中添加某些内容,从而导致列表动态增长时,总是会发生此错误

HandleList
对象传递到包和返回包的方式是否正确?关于包和内存管理,有什么重要的知识需要了解吗?或者错误一定是在其他地方


编辑如果错误可能发生在其他地方,我应该如何调试这样的东西?有什么经验吗?

我猜您正在不同的包中编译相同的代码,可能也在应用程序的可执行文件中。无论是静态链接(在项目选项中列出它们)还是动态链接(使用
LoadPackage
),每个单元都必须仅链接到一个模块中,否则会出现重复的代码冲突。检查您的包依赖项(
要求
子句),主项目选项中的运行时包列表,查看有关隐式包含单元的编译器警告。

我猜您正在不同的包中编译相同的代码,可能也在应用程序可执行文件中。无论是静态链接(在项目选项中列出它们)还是动态链接(使用
LoadPackage
),每个单元都必须仅链接到一个模块中,否则会出现重复的代码冲突。检查程序包依赖项(
要求
子句),主项目选项中的运行时程序包列表,查看有关隐式包含单元的编译器警告。

这是正常的,不会出现问题。除非那些普通的东西在捉弄你。您使用的是什么Delphi版本以及如何设置FastMMI我使用的是D2010和FastMM的FullDebugMode。这是正常的,不会出现任何问题。除非那些普通的东西在捉弄你。您使用的是什么Delphi版本以及如何设置FastMMI我使用的是D2010和FastMM的FullDebugMode。那么,在packages
contains
子句和应用程序中都使用unit
CommonTuff
是错误的吗?替代方案是什么?不确定我是否完全理解你的回答。也许你可以解释得更详细一点。谢谢可以在应用程序中使用该单元,但是项目必须使用包含它的运行时包,否则您将在可执行文件中再次链接该单元。如果要使用更多的包,则每个单元必须仅位于一个包中(contains子句)。使用相同单元的任何其他包必须引用原始包(requires子句)。那么,在packages
contains
子句和应用程序中都使用单元
CommonStuff
是否错误?替代方案是什么?不确定我是否完全理解你的回答。也许你可以解释得更详细一点。谢谢可以在应用程序中使用该单元,但是项目必须使用包含它的运行时包,否则您将在可执行文件中再次链接该单元。如果要使用更多的包,则每个单元必须仅位于一个包中(contains子句)。使用相同装置的任何其他包必须参考原始包(requires子句)。