1

我收到了一个运行时 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;

即使我收到错误,该过程也完全成功。如果我简单地注释掉整个终结,错误就会消失,但我显然不想泄漏内存。我是否不正确地调用免费?

4

1 回答 1

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 一个 TObjectList 与 OwnsObjects=True 那么您的完成代码将如下所示

finalization

CacheList.Free;
于 2012-11-18T11:10:14.143 回答