Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.10.18;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.022 c
1-1219579189
dmitry_12_08_73
2008-08-24 15:59
2009.10.18
Реализация полупрозрачного прямоугольника


6-1205348739
Igor23
2008-03-12 22:05
2009.10.18
idhttp


15-1250594396
Vera
2009-08-18 15:19
2009.10.18
JvComponentBase


2-1250151996
Дмитрий Л.
2009-08-13 12:26
2009.10.18
Система контроля ошибок


3-1227770209
alexnmsk
2008-11-27 10:16
2009.10.18
Microsoft SQL Server и RAISERROR





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский