Убидительная просьба не давать ссылки
опять на модуль с утечкой!

Показываю на примере, а то многие не
понимают где там ошибка
ннаписано
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;

Компилим, запускаем, нажимаем кнопку и
пытаемся закрыть приложение. При
закрытии менеджер нас и "обрадует"
своим сообщением.

Ответить