Текущий архив: 2003.07.21;
Скачать: CL | DM;
Вниз
При закрытии программы возникают ошибка очистки памяти Найти похожие ветки
← →
INTAARI (2003-07-07 14:39) [0]Здравствуйте МАСТЕРА! У меня возникла проблема с освобождением памяти при работе с TList. При закрытии программы возникает ошибка "List capacity out of bounds(600)". В процессе работы программы утечки памяти нет. В программе есть два Lista на 600 и 6 указателей. Причем иногда программа завершается без ошибок, а иногда вылезает ошибка на 600. Помогите разобраться в чем дело.
procedure TfrmMeteo.Wind_PackStringPacket(Sender: TObject;
Data: String);
var
i:integer;
begin
WDlist.count:=600;
WDlist.Capacity:=WDlist.count;
Dispose(WDlist.items[599]);
WDList.Delete(599);
new(WD);
WDlist.Insert(0,WD);
. . . .
TAlist.count:=6;
TAlist.Capacity:=TAlist.count;
new(TA);
Talist.Insert(0,TA);
Dispose(TAlist.items[5]);
TAList.Delete(5);
. . . .
end
procedure TfrmMeteo.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;
for i:=0 to TAlist.count-1 do
begin
DisPose(TAlist.items[i]);
end;
TAlist.Free;
end;
← →
Семен Сорокин (2003-07-07 14:41) [1]Добавляй так:
new(WD);
WDlist.Add(WD);
и ошибок не будет.
← →
INTAARI (2003-07-07 14:51) [2]
> Семен Сорокин © (07.07.03 14:41)
Дело в том, что мне надо добавлять новое значение именно в начало списка.
← →
Skier (2003-07-07 14:53) [3]1)
WDlist.count:=600;
А компилятор разве это пропускает ?
2) Покажи что есть WD
← →
INTAARI (2003-07-07 14:54) [4]
> Семен Сорокин © (07.07.03 14:41)
Список ограничен 600 значениями
← →
Семен Сорокин (2003-07-07 14:55) [5]INTAARI © (07.07.03 14:51)
а в чем проблема:
new(WD);
WDlist.Insert(0, WD);
← →
INTAARI (2003-07-07 14:57) [6]> Skier © (07.07.03 14:53)
1)Компилятор это пропускает и все работает без проблем, только при закрыти проги, ошибка возникает.
2)WD - это переменная приходящяя на СОМ порт.
← →
wl (2003-07-07 14:59) [7]procedure TfrmMeteo.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;
.....
В методе FormClose надо удалять элементы так:
for i:=0 to WDlist.count-1 do
begin
DisPose(WDlist.items[ 0]);
WDList.Delete( 0);
end;
то есть удалается всегда нулевой элемент. Мне кажется так...
← →
Семен Сорокин (2003-07-07 15:00) [8]может тогда
array [0..599] of WD
подойдет?
← →
Семен Сорокин (2003-07-07 15:02) [9]WD - указатель?
если да то надо так:
DisPose(WD(WDlist.items[i]));
← →
Skier (2003-07-07 15:03) [10]>INTAARI © (07.07.03 14:57)
1) Моя ошибка, думал что read-only
2) Поконкретней. Что за переменная ?
← →
INTAARI (2003-07-07 15:32) [11]
> Skier © (07.07.03 15:03)
> Семен Сорокин © (07.07.03 15:02)
WD указатель
← →
Skier (2003-07-07 15:36) [12]>INTAARI © (07.07.03 15:32)
указатель на что ? код-то покажи. Али сие тайна вековечная ?
Правду из тебя, ну просто клещами тянем ! :)
← →
INTAARI (2003-07-07 17:15) [13]
> Skier © (07.07.03 15:36)
Извени за задержку, начальник отвлек:
type TVal = ^real;
var
frmMeteo: TfrmMeteo;
WDlist, TAlist:Tlist;
TA,WD:TVal;
implementation
uses Seting;
{$R *.dfm}
procedure TfrmMeteo.Wind_PackStringPacket(Sender: TObject;
Data: String);
var i:integer;
begin
///Добавление в начало нового значеиния направления
// и удаление последнего с очищением памяти
WDlist.count:=WSlist.count;
WDlist.Capacity:=WDlist.count;
Dispose(WDlist.items[599]);
WDList.Delete(599);
new(WD);
WDlist.Insert(0,WD);
//Разбор пакета направления
WD^:=strtoint(copy(Data,1,Pos(",",Data)-1));
WDlist.Pack;
end;
procedure TfrmMeteo.FormShow(Sender: TObject);
begin
WDlist:=tlist.Create;
TAlist:=tlist.Create;
end;
procedure TfrmMeteo.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;
for i:=0 to TAlist.count-1 do
begin
DisPose(TAlist.items[i]);
end;
TAlist.Free;
end.
← →
Skier (2003-07-07 17:23) [14]Хм...
Попробуй так :
1)WDlist.count:=WSlist.count;
выбрось
2)WDlist.Capacity:=WDlist.count;
Dispose(WDlist.items[599]);
WDList.Delete(599);
new(WD);
WDlist.Insert(0,WD);
Перенеси в OnCreate
3)for i:=0 to WDlist.count-1 do
begin
DisPose(WDlist.items[i]);
Не спасёт ?
end;
WDlist.Free;
for i:=0 to TAlist.count-1 do
begin
DisPose(TAlist.items[i]);
end;
TAlist.Free;
Перенеси в OnDestoy
← →
pasha_golub (2003-07-07 17:35) [15]Ребятоньки при удаленни Count уменьшается! А вы его в цикле гоните!
← →
pasha_golub (2003-07-07 17:36) [16]Извините! Поспешил :-)
Страницы: 1 вся ветка
Текущий архив: 2003.07.21;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.008 c