Текущий архив: 2003.01.20;
Скачать: CL | DM;
Вниз
Освобождение памяти Найти похожие ветки
← →
Shil © (2003-01-10 21:48) [0]Это сервис под 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;
← →
asmith (2003-01-10 22:00) [1]OperList ты освобождаешь правильно (можно просто FreeAndNil(OperList);), а как насчет содержимого OperList? Если ты добавляешь в него объекты, их нужно явно разрушать. Либо использовать класс TObjectList (или быстренько написать свой на базе TList).
← →
Shil © (2003-01-10 22:13) [2]с ним понятно сенкс, а вот что на счёт TQuery и TDatabase
← →
Shil © (2003-01-10 22:39) [3]и вообще правильна ли конструкция?
if assigned(SameObject) then
Begin
SameObject.Free;
SameObject:= nil;
end;
← →
Shil © (2003-01-10 22:45) [4]to asmith: а разве когдя я делаю OperList.free то содержимое не убивается, или надо доделать явный деструктор например
TOperList = class(TList)
Some: TOperators
public
Constructor Create();
Destructor Destroy;
end;
Destructor TMyMessage.Destroy;
begin
Some.Free;
end;
?????
← →
Rouse_ © (2003-01-10 23:20) [5]> Shil © (10.01.03 22:39)
Достаточно SameObject.Free;
В противном случае FreeAndNil();
> Shil © (10.01.03 22:45)
Именно так и нужно делать
Желаю успехов
← →
Shil © (2003-01-10 23:25) [6]а как на счёт TQuery и TDatabase? верно ли
← →
Rouse_ © (2003-01-10 23:47) [7]Там все правильно
Желаю успехов
← →
Shil © (2003-01-10 23:56) [8]а когда я делаю
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-11 00:09) [9]Да, вы можете это сами проверить всего лишь запустив данный код с установкой нужных точек прерываний.
Желаю успехов
← →
Shil © (2003-01-11 00:19) [10]это сервис:(
а дебагится он почему то не хочет:(
Страницы: 1 вся ветка
Текущий архив: 2003.01.20;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.021 c