Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.014 c
14-68027
Klot
2003-07-04 18:43
2003.07.21
Настройка среды


1-67889
SiJack
2003-07-08 11:33
2003.07.21
Как получить список файлов не используя визуальных компонен


14-67995
Кен
2003-06-29 05:45
2003.07.21
Как проще всего преобразовать программу в компонент ?


6-67953
LedWorm
2003-05-13 21:53
2003.07.21
Открытие Браузера по событию.


14-67999
X-trimal
2003-07-04 11:03
2003.07.21
The Best