我在使用由 Delphi XE 中的 WSDL 导入器创建的 TRemotable 后代类的内存管理方面遇到了一些挑战。
TRemotable 后代类声明如下:
Patient = class(TRemotable)
private
...
FDOB: TXSDateTime;
...
function GetDOB: TXSDateTime;
procedure SetDOB(const ATXSDateTime: TXSDateTime);
...
public
destructor Destroy; override;
published
...
property DOB: TXSDateTime read GetDOB write SetDOB;
...
end;
...
implementation
...
destructor Patient.Destroy;
begin
SysUtils.FreeAndNil(FDOB);
inherited Destroy;
end;
...
function Patient.GetDOB: TXSDateTime;
begin
Result := FDOB;
end;
procedure Patient.SetDOB(const ATXSDateTime: TXSDateTime);
begin
FDOB := ATXSDateTime;
end;
我注意到的一个问题是,当我创建和使用 TXSDateTime 后代 DOB(或在另一个示例中,称为 'Qty' 的 TXSDecimal)时,如果我使用 FreeAndNil(Qty) 或 FreeAndNil(DOB),Patient 类仍会尝试 FreeAndNil(TXSCustom_Descendant ); 我将从 EurekaLog 内存泄漏检测器中获得“Multi Free”异常。如果我不释放 TXSxxx 对象,而只是释放 Patient 类 - 无论如何都会在对象上调用 FreeAndNil(),我会遇到内存泄漏。
我意识到这听起来有点模糊,但是我已经使用 Web Svcs、WSDL 导入器和各种相关接口进行了很多工作,并且从未见过这样的问题。
TIA