![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Освобождение памяти [D5, NT4]
Shil © (2003-01-10 21:48:00)Это сервис под NT , он работает нормально, проверяет ящик, еси там есть письма то запихивает их в базуданных, и пересылает их. но это не главное. Со временем работы ОН (сервис) сильно РАСПУХАЕТ по непонятным мне пока причинам, помогите плиз
Пдскажите что не таквот примарный код, на логику сильно не смотрите, я показал основные конструкции, мои классы и работа с ними. скорее всего я как то не верно освобождаю память или что то в этом роде, там где стоят !!!!!!!!! происходит создание или удаление объектов:
type
TPostServise = class(TService)
Database1: TDatabase; Компонента на форме"
private
{ Private declarations }
Query1,Query2,Query3,Query4:TQuery;
OnlytoOper,TextFoUsers,BlackList:TstringList;
OperList:TList;
reg: TRegistry;
public
.....
end;
TOperators = class(TObject)
FName,FAddress:String;
public
Constructor Create(AName, AAddress : String);
end;
TMyMessage = class (TObject)
From,Too,Replay : TIdEMailAddressItem;
Body: TIdHeaderList;
public
Constructor Create;
Destructor Destroy;
end;
var
PostServise: TPostServise;
OperAdress:TOperators;
Mess1,Uved: TMyMessage;
implementation
{$R *.DFM}
Constructor TOperators.Create;
Begin
FName := AName;
FAddress := AAddress;
End;
Constructor TMyMessage.Create;
begin
From:=TIdEMailAddressItem.Create(Nil);
Too:=TIdEMailAddressItem.Create(Nil);
Replay:=TIdEMailAddressItem.Create(Nil);
Body:=TIdHeaderList.Create;
end;
Destructor TMyMessage.Destroy;
begin
From.Free;
Too.Free;
Replay.Free;
Body.Free;
end;
procedure TPostServise.bodyReck(Sender: TObject);
begin
Query1:= TQuery.Create(Nil);
try
with Query1 do
ExecSQL;
end;
Finally
Query1.Free;
Query1:=nil;
end;
end;
end;
procedure TPostServise.Timer1Timer(Sender: TObject);
begin
try
DataBAse1.Open;
try
While AmoMes >0 do
begin {2}
mess1:= TMyMessage.Create;
If true then
Begin {3}
if Opera Then
Begin {6}
Query3:= TQuery.Create(Nil); !!!!!!!!!!!!!!!
Query4:= TQuery.Create(Nil); !!!!!!!!!!!!!!!
try {D}
with Query3 do
begin {8}
.....
ExecSQL;
end; {8}
with Query4 do //***Извлекаем адрес для ответа на заявку
begin {9}
.........
Open;
end; {9}
Finally {D}
if assigned(Query4) then Begin Query4.Free; Query4 := nil; end; !!!!!!!!!!!!!
if assigned(Query3) then Begin Query3.Free; Query3:=nil; end; !!!!!!!!1
end; {D}
Query2:= TQuery.Create(Nil); !!!!!!!!!!
try {E}
with Query2 do
begin {14} //
.........
Open;
end; {14} //
Finally {E}
Query2.Free; !!!!!!!!
Query2:=nil; !!!!!!!!
end; {E}
end;{13} //КОНЕЦ
if not povtor then
if assigned(Mess1) then Begin Mess1.Free; Mess1:= nil; end;
if assigned(Query1) then begin Query1.Free; Query1:=nil; end; !!!!!!!!!!!!!
if assigned(Query2) then begin Query2.Free; Query2:=nil; end; !!!!!!!!!!!!!
if assigned(Query3) then begin Query3.Free; Query3:=nil; end; !!!!!!!!!!!!!
if assigned(Query4) then Begin Query4.Free; Query4 := nil; end; !!!!!!!!!!!!!
end;{2}
finally
If Database1.Connected Then Database1.Close; !!!!!!!!
end;
end.
И правильно ли так освобождать объект?
if assigned(OperList) then
Begin
OperList.Free;
OperList:= nil;
end;
Shil (2003-01-11 00:19:00) [1]это сервис:(
а дебагится он почему то не хочет:(
Rouse_ (2003-01-11 00:09:00) [2]Да, вы можете это сами проверить всего лишь запустив данный код с установкой нужных точек прерываний.
Желаю успехов
Shil (2003-01-10 23:56:00) [3]а когда я делаю
TOperList = class(TList)
Some: TOperators
public
Constructor Create();
Destructor Destroy;
end;
Destructor TOperList.Destroy;
begin
Some.Free;
end;
....
var AAAA:TOperList;
....
procedore some();
begin
AAAA.free
end
Вызывается TOperList.Destroy ??
Rouse_ (2003-01-10 23:47:00) [4]Там все правильно
Желаю успехов
Shil (2003-01-10 23:25:00) [5]а как на счёт TQuery и TDatabase? верно ли
Rouse_ (2003-01-10 23:20:00) [6]> Shil © (10.01.03 22:39)
Достаточно SameObject.Free;
В противном случае FreeAndNil();
> Shil © (10.01.03 22:45)
Именно так и нужно делать
Желаю успехов
Shil (2003-01-10 22:45:00) [7]to asmith: а разве когдя я делаю OperList.free то содержимое не убивается, или надо доделать явный деструктор например
TOperList = class(TList)
Some: TOperators
public
Constructor Create();
Destructor Destroy;
end;
Destructor TMyMessage.Destroy;
begin
Some.Free;
end;
?????
Shil (2003-01-10 22:39:00) [8]и вообще правильна ли конструкция?
if assigned(SameObject) then
Begin
SameObject.Free;
SameObject:= nil;
end;
Shil (2003-01-10 22:13:00) [9]с ним понятно сенкс, а вот что на счёт TQuery и TDatabase
asmith (2003-01-10 22:00:00) [10]OperList ты освобождаешь правильно (можно просто FreeAndNil(OperList);), а как насчет содержимого OperList? Если ты добавляешь в него объекты, их нужно явно разрушать. Либо использовать класс TObjectList (или быстренько написать свой на базе TList).