当我打电话给这个终结部分时,为什么我会收到217错误?

时间:2012-11-18 06:12:04

标签: delphi

我收到运行时217错误,我已经跟踪到我的某个单位的终结部分。这是代码:

finalization
begin
  for I:= 0 to CacheList.Count - 1 do
  begin
    tempRecord := CacheList.Items[I];
    for k := 0 to length(tempRecord.details) - 1 do
    begin
      tempRecord.Details[k].free;
    end;
    tempRecord.free;
  end;
  CacheList.Free;
end;

和tempRecord是:

Record = class
 Details : array of CachedDetails;
 key : string;
end;

CachedDetails = class
 EDate : TDateTime;
 A     : Real;
 B     : Real;
 C     : Real;
end;

即使我收到错误,该过程也会完全成功。如果我只是注释掉整个定稿,那么错误就会消失,但我显然不想泄漏内存。我不正当地称自由了吗?

1 个答案:

答案 0 :(得分:1)

对于列表中的免费项目,它不是一个好建议,而它们属于列表。 你必须检查它是否是一种TObjectList,如果这个List拥有对象。

或者您从列表中提取项目并将其释放。

finalization
begin
  while CacheList.Count > 0 do
  begin
    tempRecord := CacheList.Extract( CacheList.First );
    for k := 0 to length(tempRecord.details) - 1 do
    begin
      tempRecord.Details[k].free;
    end;
    tempRecord.free;
  end;
  CacheList.Free;
end;

但正如考虑一下,如果你将破坏责任移交给Record类和CacheList一个带有OwnsObjects = True的TObjectList那么你的finlization代码将会是这样的

finalization

CacheList.Free;