Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.30;
Скачать: CL | DM;

Вниз

Переполнение памяти.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.032 c
6-1099995518
Sergey18
2004-11-09 13:18
2005.01.30
Определение изменения Web-страницы


1-1106146280
lamo
2005-01-19 17:51
2005.01.30
Ошибка String or Integer


14-1105546454
Федюлин Григорий
2005-01-12 19:14
2005.01.30
Подскажите...


14-1105516116
Anonimus
2005-01-12 10:48
2005.01.30
Windows XP home


1-1106117309
Rusan
2005-01-19 09:48
2005.01.30
Как добавить строку в лист Excel