Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.18;
Скачать: CL | DM;

Вниз

FastMM & records   Найти похожие ветки 

 
_Андрей   (2009-08-13 11:48) [0]

есть такая процедура (тут с сокращениями):

type TFieldDesc = record
 Table: integer;
 Name, Title: string;
 Visible: boolean;
 Width: integer;
 FontName: string;
 Size: integer;
 Styles: TFontStyles;
 Color, BkColor: TColor
end;

procedure TMainForm.OnAfterShow(Sender: TObject);
var
 i: Integer;
 FieldDesc: TFieldDesc;
begin
 for i := 0 to TDataSet(Sender).Fields.Count - 1 do
   begin
   FillChar(FieldDesc, sizeof(TFieldDesc), 0);
   FieldDesc.Name := TDataSet(Sender).Fields[i].FieldName;
   // дальше идут нужные для FieldDesc действия (заккоментированы и на пример не влияют)
   end
end


Так вот, FastMM умудряется найти память которую я не освобождаю, у меня Count = 15, вот он мне и говорит о 14 (именно о 14-ти) неосвобождённых AnsiString`ах как будто я их здесь создаю, исп-ся то одна переменная, и вообще, FieldDesc - это локальная процедура и локальная для этой процедуры переменная, разве нужно здесь что-то освобождать.

Я попробовал написать так:

procedure TMainForm.OnAfterShow(Sender: TObject);
var
 i: Integer;
 FieldDesc: TFieldDesc;
begin
 FillChar(FieldDesc, sizeof(TFieldDesc), 0);
 for i := 0 to TDataSet(Sender).Fields.Count - 1 do
   begin
   FieldDesc.Name := TDataSet(Sender).Fields[i].FieldName;
   end
end


Так всё норм, а в 1-м то случае что была за ошибка? Объясните, плиз...


 
Palladin ©   (2009-08-13 11:54) [1]

а чего не понятного? два поля в записи у тебя String, а за такое вольное обращение с идентификаторами этого непростого типа, как заполнение нулями можно и по затылку схлопотать... выделенная память под строчки не освободится...


 
Сергей М. ©   (2009-08-13 12:06) [2]


> FillChar(FieldDesc, sizeof(TFieldDesc), 0);


В обоих случаях это строчка представляет реальную опасность с т.з. утечек.
Это как максимум.
А как минимум - это совершенно бестолковое телодвижение. Зачем, спрашивается, потребовалось предварительно чистить структуру, если она и так уже "чистая" касаемо String-полей ?


 
Anatoly Podgoretsky ©   (2009-08-13 12:09) [3]

> _Андрей  (13.08.2009 11:48:00)  [0]

Хочешь жить без проблем - не используй низкоуровневые функции работы с нетипизироваными указателями, типа FillChar, ZeroMemory, MoveMemory и подобными.


 
_Андрей   (2009-08-13 12:14) [4]


> Сергей М. ©   (13.08.09 12:06) [2]


По мере прохождения цикла она же запоняется значениями...


> Anatoly Podgoretsky ©   (13.08.09 12:09) [3]


Чтож выходит так и писать: Rec.String1 := "";  Rec.String2 := ""?


> Palladin ©   (13.08.09 11:54) [1]


Так в справке по FillChar ничего такого не написано...


 
Anatoly Podgoretsky ©   (2009-08-13 12:20) [5]


> Чтож выходит так и писать: Rec.String1 := "";  Rec.String2
> := ""?

В данном контексте не надо, а вот для других полей неясно.

> Так в справке по FillChar ничего такого не написано...

Так справка по этой части не изменялась давно, а вот поддержка предупреждений по этому поводу включена уже давно. Связано с .NET и другими будущими средами с managed code.
Лучше бы тебе поверить мне. :-)


 
Palladin ©   (2009-08-13 12:21) [6]


> Так в справке по FillChar ничего такого не написано...

А почему в справке по FillChar должно быть написано что не лейте горячее кофе на промежность? В справке по FillChar написано то что и должно быть написано. Там так же не написанно что нельзя делать FillChar(memo1,"0",4) делать тоже нельзя


 
Palladin ©   (2009-08-13 12:22) [7]


> Чтож выходит так и писать: Rec.String1 := "";  Rec.String2
> := ""?

Писать надо Finalize(FieldDesc)


 
Сергей М. ©   (2009-08-13 12:24) [8]


> По мере прохождения цикла она же запоняется значениями


Вот и пусть себе заполняется, обнулять-то зачем ?


 
_Андрей   (2009-08-13 12:44) [9]

ok, спасибо



Страницы: 1 вся ветка

Текущий архив: 2009.10.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
15-1250185590
Andy BitOff
2009-08-13 21:46
2009.10.18
Офис Google в ...


2-1249568385
caps14
2009-08-06 18:19
2009.10.18
перемещение изображений по форме


15-1250675891
Yurikon
2009-08-19 13:58
2009.10.18
Контроль за использованием памяти


2-1250146359
oldman
2009-08-13 10:52
2009.10.18
Запуск программы, установленной в Виндоус по умолчанию


2-1250632750
exkalement
2009-08-19 01:59
2009.10.18
удаление ячейки у listbox`а и у valuelisteditor`а