多么美妙的奇迹?跌倒了,至少你开枪了。任何人都可以遇到吗?
function TUAdapter<T>.getFields: AnsiString;
var
Props: TStringList;
TmpStr: String;
Res,Prop: AnsiString;
i: integer;
begin
try
Props:=getProps;
for i:= 0 to Props.Count - 1 do
begin
TmpStr:=''; //Падает здесь после нескольких проходов
TmpStr:='"'+Props[i]+'"';
if Res = ''
then Res:= Res + TmpStr
else Res:= Res + ', '+TmpStr;
end;
Result:= Res
finally
Props.Destroy;
end;
end;
function TUAdapter<T>.GetProps: TStringList;
var
list: TStringList;
Props : PPropList;
i: integer;
propCount : integer;
begin
if (uEntityObj.ClassInfo = nil)
then begin
raise Exception.Create('Not able to get properties!');
end;
try
List:= TStringList.Create;
propCount := GetPropList(uEntityObj.ClassInfo, Props);
for i:=0 to propCount-1 do
begin
list.Add(Props[i].Name);
end;
finally
FreeMem(Props);
end;
Result:= list;
end;
function GetPropList(TypeInfo: PTypeInfo; out PropList: PPropList): Integer;
begin
Result := GetTypeData(TypeInfo)^.PropCount;
if Result > 0 then
begin
GetMem(PropList, Result * SizeOf(Pointer));
GetPropInfos(TypeInfo, PropList);
end;
end;
在上面的代码中,我没有看到任何明显的错误——除了属性列表为空的退化情况:
同时,让我们谈谈在以下方面使用内存
try/finally
:Free
self
在nil
调用之前检查Destroy
- 无需在每次调用虚拟析构函数之前都检查引用。如果一切都失败了,请尝试替换
AnsiString
为string
并禁用优化。