Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.039 c
4-1102487250
Рамиль
2004-12-08 09:27
2005.01.30
Можно как нибудь запустить службу с нужным приоритетом?


14-1105292973
Kerk
2005-01-09 20:49
2005.01.30
Чего за нахрен?


14-1105019399
VEG
2005-01-06 16:49
2005.01.30
ОС будущего - как вы ее себе представляете?


1-1106113494
Strech
2005-01-19 08:44
2005.01.30
Компрессия


14-1105348580
dimka.b
2005-01-10 12:16
2005.01.30
Смена профессии.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский