Delphi 自由对象';Rtti的s场

Delphi 自由对象';Rtti的s场,delphi,delphi-xe4,Delphi,Delphi Xe4,如何在delphi(XE4)中通过Rtti释放对象的字段 我需要动态释放所有字段 我可以找到字段,但我现在不知道如何释放它们: destructor TKnBase.Destroy; var AContext: TRttiContext; AField: TRttiField; begin for AField in AContext.GetType(Self.ClassInfo).GetFields do begin -->free filed (AField)

如何在delphi(XE4)中通过
Rtti
释放对象的字段

我需要动态释放所有字段

我可以找到字段,但我现在不知道如何释放它们:

destructor TKnBase.Destroy;
var
  AContext: TRttiContext;
  AField: TRttiField;
begin
  for AField in AContext.GetType(Self.ClassInfo).GetFields do
  begin
     -->free filed (AField)
  end;

  inherited;
end;
我尝试过这个,但不起作用:

destructor TKnBase.Destroy;
type
  dp = ^TObject;
var
  AContext: TRttiContext;
  AField: TRttiField;
  p: dp;
begin
  for AField in AContext.GetType(Self.ClassInfo).GetFields do
  begin
    p := dp(NativeInt(AField) + AField.Offset);
    TObject(p^).Free;
  end;

  inherited;
end;

偏移量相对于实例指针。您的代码应该是:

 p := dp(NativeInt(Self) + AField.Offset);
您可能更喜欢使用字段对象的
GetValue
方法来读取字段的值。所以要避免所有的指针运算

你在这里所做的是非常有限的。所有派生类都必须符合此策略。所有字段都必须是对象,并且必须属于此类。不能有整数字段、布尔字段等。至少您应该只尝试销毁作为对象的字段


我的直觉告诉我,你所尝试的将被证明是行不通的

谢谢,我知道这一点,但我不想用它作为一个自由领域的方法。这只是为了解决某些条件的问题。@Pejman.Nik什么“特定条件”可能要求您使用RTTI来销毁内容?另外,
GetType(Self.ClassInfo)。GetFields
也检索所有派生字段吗?如果派生析构函数和基析构函数尝试释放相同的字段,那么这将是危险的。也许你需要
GetType(TKnBase).而不是GetDeclaredFields
?@david heffernan我正在尝试从TKnBase继承的所有类的自由对象字段,但现在读了你的评论后,我认为我不应该这样做。再次感谢。我会考虑另一个解决办法。