![]() |
|
|
|
|
#1
|
||||
|
||||
|
есть несколько нубоватых вопросов.
1. Как создать новый экземпляр для record'а, ну то есть есть переменная Р и в цикле для этой перменой должен создаваться новый экземпляр и добавляться в TList (ну или массив), New, GetMem или ещё что надо использовать? 2. Программа активно работает с большими текстами, все они хранятся в string переменных, из-за этого происходят утечки. Вопрос, как освободить память используемой строкой? |
|
#2
|
||||
|
||||
|
Насколько я помню, если у тебя в структуре нет строк то достаточно New. Дельфи сам по типам определит количество необходимой памяти под новую переменную, а иначе придется еще выделять память GetMem под строку. И конечно освобождать память придется в обратном порядке.
А вообще вот тут посмотрите, я там нечто похожее выкладывал: http://www.cyberforum.ru/post330460.html Последний раз редактировалось Страдалецъ, 16.11.2009 в 13:52. |
|
#3
|
|||
|
|||
|
Код давай. Тут не телепаты собрались.
По поводу освобождения памяти. 1. Освободить строку можно через вызов SetLength. 2. На самом деле память вернется в менеджер памяти программы. Если тебе надо именно отдать память системе, то копай в сторону API, там есть функция, которая позволяет это сделать (SetProcessWorkingSetSize Function) |
|
#4
|
||||
|
||||
|
Цитата:
мне казалось я обьяснил нормально, лана вот пример:Код:
type
PMyRec = ^TMyRec;
TMyRec = record
var1: Integer;
var2: Pointer;
end;
...
procedure TForm1.DoIt();
var
mylist: TList;
p: TMyRec;
i: Integer;
begin
mylist := TList.Create;
for i:=0 to 10 do
begin
{вот здесь надо создать новый экземпляр в переменную p, но как?}
FillChar(p,SizeOf(TMyRec),$00);
p.var1 := i;
mylist.Add(@p);
end;
for i := 0 to mylist.Count - 1 do
Memo1.Lines.Add(IntToStr(PMyRec(mylist[i])^.var1));
{здесь в мемо выводится все 10, ну это, как я понимаю, изза того что все итемы в листе с одним адресом}
end; |
|
#5
|
||||
|
||||
|
Код:
begin
{вот здесь надо создать новый экземпляр в переменную p, но как?}
{ну вроде так}
New(P);
P^.Var1 := i;
GetMem(P^.Var2, ...); //Тут надо указать размер ожидаемой переменной в Var2, если это будет строка, то Length(S)+1;
P^.Var2 := ... //Собственно присвоение
mylist.Add(@p);
end; |
|
#6
|
||||
|
||||
|
Страдалецъ, ещё раз спасиб. Только сёдня дошло что использовать PMyRec и к нему применять New, а не к TMyRec...
|