Убидительная просьба не давать ссылки
опять на модуль с утечкой!
Показываю на примере, а то многие не
понимают где там ошибка
ннаписано
fld[i].VType:=vtAnsiString;
string(fld[i].VString):=Grid.SortMarkedColumns[i].fieldname;
А теперь смотрим описание TVarRect
TVarRec = record { do not pack this record; it is compiler-generated }
case Byte of
vtInteger:(VInteger: Integer; VType: Byte);
vtBoolean:(VBoolean: Boolean);
vtChar: (VChar: Char);
vtExtended: (VExtended: PExtended);
vtString: (VString: PShortString);
vtPointer:(VPointer: Pointer);
vtPChar: (VPChar: PChar);
vtObject: (VObject: TObject);
vtClass: (VClass: TClass);
vtWideChar: (VWideChar: WideChar);
vtPWideChar: (VPWideChar: PWideChar);
vtAnsiString: (VAnsiString: Pointer);
vtCurrency: (VCurrency: PCurrency);
vtVariant:(VVariant: PVariant);
vtInterface: (VInterface: Pointer);
vtWideString: (VWideString: Pointer);
vtInt64: (VInt64: PInt64);
end;
Из него видем, что vtAnsiString это
указатель, на AnsiString, а мы туда пытаемся
запихнуть VString, который является
PShortString;
Если кто-то до сихпор не верит, что это
приводит к утечкам, то пишим
элементарный пример на BDS2006 (на 2006, т.к.
в нем можно сказать менеджеру памяти
сообщать об утечках)
procedure TForm1.Button1Click(Sender: TObject);
var FLD : array of TVarRec ;
begin
setlength(fld,1);
fld[0].VType:=vtAnsiString;
string(fld[0].VString):= Self.Caption;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ReportMemoryLeaksOnShutdown := DebugHook 0;
end;
Компилим, запускаем, нажимаем кнопку и
пытаемся закрыть приложение. При
закрытии менеджер нас и обрадует
своим сообщением.