Главная страница
    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.48 MB
Время: 0.008 c
1-67864
johny
2003-07-08 06:44
2003.07.21
печать из компонента WebBrowser


1-67870
Yojik
2003-07-07 10:15
2003.07.21
Unicod - сравнение кодовых таблиц


14-68043
Evgeniy
2003-07-04 13:54
2003.07.21
Распознавание текста


1-67836
ruslan_as
2003-07-07 12:30
2003.07.21
Как перевести PDword в String


11-67743
Fantasist
2002-11-17 08:12
2003.07.21
KOLActiveX





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский