【发布时间】:2015-08-26 08:22:55
【问题描述】:
我实现了以下类:
type
TUtilProcedure = procedure(var AJsonValue: TJSONObject);
TCallback = class
private
FName: string;
FProcedure: TUtilProcedure;
FAnnotation: string;
public
constructor Create(AName: string; AProcedure: TUtilProcedure; AAnnotation: string); overload;
constructor Create(ACallback: TCallback); overload;
property Name: string read FName;
property Proc: TUtilProcedure read FProcedure;
property Annotation: string read FAnnotation;
end;
然后我有一个全局变量:
procedures: TDictionary<string, TCallback>;
在OnFormActivate 过程中,我初始化了procedures 变量:
procedures := TDictionary<string, TCallback>.Create();
procedures.Add('something', TCallback.Create('sth', @proc, 'annotation'));
// ....
然后在OnFormClose我释放它:
procedures.Clear;
procedures.Free;
我的代码会泄漏内存吗?如果是这样,释放dictionary 的正确方法是什么?
据我所知,迭代不是好主意。
【问题讨论】:
-
使用对象时使用
TObjectDictionary,如果要自动释放值,请在创建字典时使用[doOwnsValues] -
TCallback是否需要destructor -
TCallback现在不需要析构函数 -
@fantaghirocco 谢谢
-
不要在过程中使用
@。这会抑制编译器的类型安全。启用 Embarcadero 仍然拒绝启用的类型化地址编译器选项,这样做会让所有 Delphi 初学者遭受不必要的痛苦。
标签: delphi dictionary memory-leaks tdictionary