Высводождение памяти

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Высводождение памяти

Сообщение the_beginer » 29.07.2008 18:05:32

Доброго времени суток!

Так, господа и дамы, нарвался на интересный вопрос:

есть код
Код: Выделить всё
...
var b : Tbutton;
begin
...
   for i := 1 to 10 do
   begin
    b := Tbutton.Create(self);
    with (b as tbutton) do
      begin
        name := 'button' + inttostr(i);
        ... // ну тут мы описываем нужные свойства
      end;
    b.parent := findcomponent('scrollbox' + inttostr(i)) as Tscrollbox;
   ...
   end; //end if i=1 ...
...


в конце, как я понимаю, мы должны высвободить память, занятую под b, т.е. написать b.free
Но! Тут собственно и вопрос, если мы это сделаем, то пропадет последняя созданная кнопка, т.е. в нашем случае button10.
Можете разъяснить ситуацию? Лазарь сам высвобождает память или b высвобаждается как-то не так?

В школе делфи не учили.


З.Ы. ПЕРЕЧИТАЛ СВОЕ СООБЩЕНИЕ И ПОНЯЛ, ЧТО ФАКТИЧЕСКИ ПРОШУ РАЗЪЯСНИТЬ МНЕ ТЕОРИЮ. НАДЕЮСЬ У ВАС ЕСТЬ ВРЕМЯ НА ЭТО
the_beginer
новенький
 
Сообщения: 30
Зарегистрирован: 29.05.2008 16:51:51

Re: Высводождение памяти

Сообщение yser » 29.07.2008 19:12:19

когда будеш освобождать форму она и удалит остальные кнопки, т.к. владельцем кнопок указана форма
yser
новенький
 
Сообщения: 29
Зарегистрирован: 06.02.2008 11:27:40

Re: Высводождение памяти

Сообщение Vadim » 29.07.2008 19:20:54

the_beginer писал(а):то пропадет последняя созданная кнопка, т.е. в нашем случае button10

Действительно, пропадёт. Заодно и пропадут и остальные 9 кнопок, причём сразу же после создания следующей кнопки, т.к. одной и той же переменной Вы каждый раз присваиваете новый адрес в памяти, а предыдущий адрес благополучно теряете.
Если надо создать несколько кнопок, то обычно делают так:
Код: Выделить всё
Var
b: array[0..9] of TButton;
i: integer;
Begin
...
For i:=0 To 9 Do
Begin
  b[i]:=TButton.Create(Form1);
  b[i].Top:=
  b[i].Left:=
  //Ну и так далее
End;
End;
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Высводождение памяти

Сообщение the_beginer » 29.07.2008 19:34:08

Vadim писал(а):
the_beginer писал(а):то пропадет последняя созданная кнопка, т.е. в нашем случае button10

А с чего бы вдруг она пропадёт? Вот если бы было так:
Код: Выделить всё
button10:=b;

тогда конечно, после b.Free пропадёт кнопка button10, т.к. это по сути будет та же кнопка b. Но если button10 создана отдельно, то b.Free никак на неё не повлияет.


Уважаемый, вот С ЧЕГО она пропадает я и хочу узнать и, соответственно, КАК ЭТО обойти или исправить. Хотя узнав ответ на "С ЧЕГО", ответ на вопрос "КАК ИСПРАВИТЬ" я думается и сам с могу найти.

Добавлено спустя 2 минуты 12 секунд:
Vadim писал(а):
the_beginer писал(а):то пропадет последняя созданная кнопка, т.е. в нашем случае button10

Действительно, пропадёт. Заодно и пропадут и остальные 9 кнопок, причём сразу же после создания следующей кнопки, т.к. одной и той же переменной Вы каждый раз присваиваете новый адрес в памяти, а предыдущий адрес благополучно теряете.
Если надо создать несколько кнопок, то обычно делают так:
Код: Выделить всё
Var
b: array[0..9] of TButton;
i: integer;
Begin
...
For i:=0 To 9 Do
Begin
  b[i]:=TButton.Create(Form1);
  b[i].Top:=
  b[i].Left:=
  //Ну и так далее
End;
End;



если мы делаем так :
var b : Tbutton;
begin
...
for i := 1 to 10 do
begin
b := Tbutton.Create(self);
with (b as tbutton) do
begin
name := 'button' + inttostr(i);
... // ну тут мы описываем нужные свойства
end;
b.parent := findcomponent('scrollbox' + inttostr(i)) as Tscrollbox;
b.free;
...
end; //end if i=1 ...

то пропадут все кнопки, а если так:
var b : Tbutton;
begin
...
for i := 1 to 10 do
begin
b := Tbutton.Create(self);
with (b as tbutton) do
begin
name := 'button' + inttostr(i);
... // ну тут мы описываем нужные свойства
end;
b.parent := findcomponent('scrollbox' + inttostr(i)) as Tscrollbox;
...
end; //end if i=1 ...
b.free;

то только последняя
Последний раз редактировалось the_beginer 29.07.2008 19:38:32, всего редактировалось 1 раз.
the_beginer
новенький
 
Сообщения: 30
Зарегистрирован: 29.05.2008 16:51:51

Re: Высводождение памяти

Сообщение Vadim » 29.07.2008 19:37:04

the_beginer
Я извиняюсь, неправильно прочитал.
Сообщение своё я отредактировал, т.к. внезапно прозрел. :)

Добавлено спустя 3 минуты 19 секунд:
the_beginer писал(а):так ты мне ответь

Таки да, отвечаю. :)
Как тольксо Вы закрываете свою программу, Лазарь освобождает всю занятую память. Если же Вы хотите удалять кнопки в процессе работы программы, то естественно это надо делать вручную.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Высводождение памяти

Сообщение v-t-l » 30.07.2008 11:21:10

Как я понял, вам нужно создать несколько кнопок, которые должны уничтожиться (освободить память) при уничтожении формы.
b.Free - не нужно, т.к. b := Tbutton.Create(self) - вы указали в качестве владельца созданной кнопки саму форму, а при своем уничтожении она (форма) уничтожит все принадлежащие ей компоненты.
Имя (b.name) кнопки указывать не обязательно - оно при ее создании такое - 'Button'+число.
v-t-l
энтузиаст
 
Сообщения: 734
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 65

Рейтинг@Mail.ru