Текущий архив: 2003.07.07;
Скачать: CL | DM;
Вниз
Освобождение памяти при завершении работы с Tlist Найти похожие ветки
← →
INTAARI (2003-06-25 11:25) [0]Привет колеги!!!
Имеется список с числом указателей 120. Каждые 2 секунды происходит добавление элемента в начало списка с выделением память. У меня возник вопрос, надоли освобождать память вылетевшей из списка записи. Так как получается, что я только выделяю память, и не очищаюь ее. Приложение при отладке работает стабильно без сбоев, память не пожирает, но при закрытии приложение говорит, что ошибка при работе с ячейкой памяти FFFFF ...
procedure TForm1.FormShow(Sender: TObject);
type tps:^real
var
WDlist :Tlist;
Dir:^real;
begin
WDlist:=tlist.Create;
end;
. . . . .
WDlist.count:=120;
WDlist.Capacity:=WDlist.count;
new(Dir);
WDlist.Insert(0,dir);
WDlist.Pack;
. . . . .
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
WDlist.Destroy;
end;
← →
panov (2003-06-25 12:23) [1]
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
i: Integer;
begin
for i := 0 to WDlist.Count-1 do
begin
DisPose(WDlist.Items[i]);
end;
WDlist.Free;
end;
Кроме того, лучше свой тип переопределить(мне кажется):
type
PReal = ^Real;
var
WDlist :Tlist;
Dir: PReal;
...
← →
гончий (2003-06-25 14:10) [2]Вот вообще без переменных (заодно и лист от Item"ов очистишь):
--------------------------
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
while WDlist.Count > 0 do
begin
DisPose(WDlist.Items[0]);
WDlist.Delete(0);
end;
WDlist.Free;
end;
← →
INTAARI (2003-06-25 16:21) [3]Спасибо гончий и panov за ответы. Вопрос состоит немногов в другом. Как освобождать память не при завершении программы, а в процессе ее работы. Т. е. каждые 2 секунды происходит добавление элемента в начало списка с выделением память, число элементов фиксированное, как мне очистить ту память которая была выделена под переменные "вылетевшие" из списка.
← →
MBo (2003-06-25 16:26) [4]перед тем, как указатель будет удален из списка, очищай. В чем проблема-то?
← →
icWasya (2003-06-25 16:27) [5]может так
new(Dir);
WDlist.Insert(0,dir);
DisPose(WDlist.Items[120]);
WDlist.Delete(120);
WDlist.Pack;
← →
panov (2003-06-25 16:38) [6]Зачем только в начало списка вставлять - непонятно.
Для того, чтобы было красиво сделано, переопредели класс TList на свой.
← →
INTAARI (2003-06-25 16:43) [7]Добавление в начало нужно, что бы после каждого добавления нового значения произодить вычисление максимальных и минимальных значений, я просто этот кусов кода не привел в тексте.
← →
MBo (2003-06-25 16:47) [8]может, имеет смысл не список, а
var A: array[0..119] of double;
добавление:
A[Counter mod 120]:=NewValue;
Inc(Counter);
← →
panov (2003-06-25 16:48) [9]Все равно непонятно, как вставка в начало может помочь в вычислении таких значений.
← →
INTAARI (2003-06-25 17:12) [10]Вычисление производится за скользящий инервал две минуты с учетом того, что каждые две секунды добавляется новое значение в начало и соответственно удаляется смамое последнее.
← →
MBo (2003-06-25 17:18) [11]>INTAARI
Мое предложение не устраивает?
← →
INTAARI (2003-06-25 17:24) [12]
> MBo
Устраивает, но надо добавить несколько строк, чтобы когда масив заполнится началось передвижение данных при добавлении, в начало новых.
← →
MBo (2003-06-25 17:31) [13]Зачем? i-й по "старости" элемент - (Counter+i) mod 120
← →
Anatoly Podgoretsky (2003-06-25 17:36) [14]Зачем тут список, когда достаточно статического массива, который при желании очень быстро смещается в любую стронону.
← →
Armen (2003-06-25 17:47) [15]>INTAARI © (25.06.03 16:43)
>Добавление в начало нужно
Dlya etogo v Delphi est" TStack i TQueue.
Страницы: 1 вся ветка
Текущий архив: 2003.07.07;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.007 c