Форум: "Начинающим";
Текущий архив: 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