Вопрос
Почему при циклической обработке записей типа Record происходит утечка памяти? У меня стоит Delphi6 Вот мой пример:
Type
TR = record
Name : String;
Ext : String;
end;
Function GetFileName(Const FileName: String): TR;
Begin
fillchar(Result,sizeof(Result),0);
Result.Name:=copy(FileName,1,pos('.',FileName)-1);
Result.Ext:=copy(FileName,pos('.',FileName)+1,Length(FileName));
end;
Procedure Go;
Var
FD : TSearchRec;
MyRec : TR;
Str : TStrings;
Begin
Str:=TStringList.create;
try
Str.clear;
if (findfirst('C:\*.*',faanyfile,FD) = 0) then
repeat
if (FD.Name = '.') or (FD.Name = '..') then Continue;
if ((FD.Attr and faDirectory) > 0) then Continue;
MyRec:=GetfileName(FD.NAME); // Утечка происходит вот тут
Str.add(MyRec.Name+'='+MyRec.Ext);
Until FindNext(FD) <> 0;
FindClose(FD);
Str.savetofile('C:\res.txt');
finally
Str.free;
end;
end;
Можно конечно обойтись и без Рекорда, но это только только пример, а в программе у меня все гораздо сложнее, да и в принципе не могу понять что я делаю не так?
Ответ
Эта проблема всех Дельфей и связана с изменением способа хранения строк (по сравнению с Паскалем) — строки хранятся динамически
Решение:
MyRec:=GetfileName(FD.NAME); // Утечка происходит вот тут
Str.add(MyRec.Name+'='+MyRec.Ext);
Finalize(MyRec); // Uninitializes a dynamically allocated variable.
Until FindNext(FD) <> 0;
Из конференции Expert_FAQ
Copyright 2000-2004 Сообщество Чайников
Контактная информация