Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизПереполнение памяти. Найти похожие ветки
← →
Lera (2005-01-19 10:41) [0]Уважаемые, такая проблема: есть класс типа TForm, несколько объявленных переменных этого класса а1, а2,.... По некому действию переменные создаются. При закрытии одной из форм вызывается процедура, находящаяся в классе, в которую передается Sender. В этой процедуре распознается какая из форм а1, а2 или др. закрыта и делается freeandnil(а1), но оперативная память после этого действия увеличивается. Подскажите пожалуйста, почему?
← →
Александр Иванов © (2005-01-19 10:43) [1]Потому что память не освобождается.
Код покажи.
← →
Lera (2005-01-19 11:25) [2]Такой код:
type
TFm_sec_prt = class(TForm)
StringGrid1: TStringGrid;
procedure ClearGrid(Grid: TStringGrid);
procedure find_prt_sec(x,y:integer;Sender:TObject;var num: integer);
procedure Insert_trips(id,xk,yk:integer;Sender:TObject)ж
procedure Zadan_dl;
procedure ris_line_fm(i:integer;canvas:TCanvas);
procedure StringGrid1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Free_mem(Sender:TObject);
procedure Close_open_sp;
procedure FormShow(Sender: TObject);
function Cur_in_rect(xk,yk:integer):boolean;
procedure FormActivate(Sender: TObject);
procedure StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormDeactivate(Sender: TObject);
private
vncol,vnrow :integer;
public
priz_w_e :integer;
procedure WMEXITSIZEMOVING(var Message: TMessage);
message WM_EXITSIZEMOVE;
end;
var
Fm_sec_prt,Fm_sec_prt1,
Fm_sec_prt2,Fm_sec_prt3,
Fm_sec_prt4,Fm_sec_prt5,
Fm_sec_prt6,Fm_sec_prt7,
Fm_sec_prt8,Fm_sec_prt9,
Fm_sec_prt10 :TFm_sec_prt;
implementation
procedure TFm_sec_prt.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Free_mem(Sender);
end;
procedure TFm_sec_prt.Free_mem(Sender:TObject);
begin
if Sender=fm_sec_prt1 then
begin
freeandnil(fm_sec_prt1);
dec(kl_fm);
mas_ful_per[1]:=0;
end;
if Sender=fm_sec_prt2 then
begin
freeandnil(fm_sec_prt2);
dec(kl_fm);
mas_ful_per[2]:=0;
end;
if Sender=fm_sec_prt3 then
begin
freeandnil(fm_sec_prt3);
dec(kl_fm);
mas_ful_per[3]:=0;
end;
if Sender=fm_sec_prt4 then
begin
freeandnil(fm_sec_prt4);
dec(kl_fm);
mas_ful_per[4]:=0;
end;
if Sender=fm_sec_prt5 then
begin
freeandnil(fm_sec_prt5);
dec(kl_fm);
mas_ful_per[5]:=0;
end;
if Sender=fm_sec_prt6 then
begin
freeandnil(fm_sec_prt6);
dec(kl_fm);
mas_ful_per[6]:=0;
end;
if Sender=fm_sec_prt7 then
begin
freeandnil(fm_sec_prt7);
dec(kl_fm);
mas_ful_per[7]:=0;
end;
if Sender=fm_sec_prt8 then
begin
freeandnil(fm_sec_prt8);
dec(kl_fm);
mas_ful_per[8]:=0;
end;
if Sender=fm_sec_prt9 then
begin
freeandnil(fm_sec_prt9);
dec(kl_fm);
mas_ful_per[9]:=0;
end;
if Sender=fm_sec_prt10 then
begin
freeandnil(fm_sec_prt10);
dec(kl_fm);
mas_ful_per[10]:=0;
end;
end;
← →
KSergey © (2005-01-19 11:40) [3]а) поменять люгику, чтобы не было нужды в этой куче переменных
б) переписать FormClose след. образом:
procedure TFm_sec_prt.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
Все! Память освободится сама
Хотя переменная, ссылающаяся на данный экземпляр - НЕ ОЧИСТИТСЯ.
Что делать - надо смотреть по задаче. Может они и вовсе не нужны?
Обрисуйте задачу более общЁ...
← →
Jel © (2005-01-19 11:42) [4]Код - сущий шедевр. :)
А если просто -procedure TFm_sec_prt.FormClose(Sender: TObject; var
Action: TCloseAction);
begin
Action := caFree;
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.036 c