![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Метод Free [D7, WinXP]
DW © (2009-11-22 13:36:00)Непонятно поведение метода Free, когда объект еще не создан. В описании класса TObject он описан как
TObject = class
...
procedure Free;
...
end;
т.е. это не метод класса и не должен выполняться, если объект не создан.
Я провёл небольшой эксперимент. Использовались Delphi 7 и Turbo Delphi 2006. Операционные системы Windows 7 и Windows XP. На форму кинул три кнопки TButton.
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
MyObject1: TObject;
end;
var
Form1: TForm1;
MyObject2: TObject;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
MyObject1.Free; // Работает корректно
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
MyObject2.Free; // Работает корректно
end;
procedure TForm1.Button3Click(Sender: TObject);
var
MyObject3: TObject;
begin
MyObject3.Free; // Приложение зависает
end;
В первых двух случаях (Кнопки Button1 и Button2), всё работает ОК - т.е. ничего не происходит. Но если же мы используем метод Free к объекту, который объявлен локально (кнопка Button3), то приложение зависает - закрывается форма, однако в процессах висит.
В связи с этим возникают вопросы.
1. Почему Free не выдает ошибку, если мы его вызываем, когда объект еще не создан?
2. Как объяснить странное поведение при нажатии кнопки Button3?
Спасибо.
korneley (2009-12-04 14:09:00) [1]Один человек прыгал с парашютом. И никогда не дёргал "кольцо", т.к. автомат за 300м до Земли и сам срабатывал. И тогда он подумал: "А что, если без этого рюкзака за спиной прыгнуть?"
~AQUARIUS~ (2009-12-04 13:37:00) [2]Нет, все-таки Free - Free и так вызывает Destroy
Германн (2009-11-22 17:10:00) [3]
> Destroy, а не Free
Согласен.
Ухарь (2009-11-22 17:04:00) [4]
> В двух первых примерах до вызова метода Free
Destroy, а не Free
Германн (2009-11-22 17:01:00) [5]
> DW © (22.11.09 13:36)
Да и еще одно маленькое добавление.
> Почему Free не выдает ошибку, если мы его вызываем, когда
> объект еще не создан?
В двух первых примерах до вызова метода Free дело реально не доходит. Перед вызовом происходит неявная проверка ссылки на nil и поскольку ссылка нулевая, то вызов не производится.
MBo (2009-11-22 15:03:00) [6]>В третьем почему-то нет.
Потому что переменная локальная, а они не инициализируются нулями
Германн (2009-11-22 15:02:00) [7]
> В третьем почему-то нет.
Вот об этом и сказано в sniknik © (22.11.09 14:05) [2]
Глобальные переменные и поля классов автоматически инициализируются нолями при старте приложения. А локальные переменные ты должен при необходимости обнулять сам.
DW (2009-11-22 14:58:00) [8]
> Так ты понял разницу между двумя первыми и третьим твоим
> примером?
В первых двух случаях указатель на объект был nil. В третьем почему-то нет.
Германн (2009-11-22 14:39:00) [9]
> DW © (22.11.09 14:34) [4]
>
>
> > когда читал книжку пропустил главу о инициализации переменных.
>
> > ..
>
> В реальных проектах, когда объекты создаются динамически,
> не всегда возможна инициализация. А уничтожать созданный
> объект нужно всегда.
Так ты понял разницу между двумя первыми и третьим твоим примером?
DW (2009-11-22 14:34:00) [10]
> когда читал книжку пропустил главу о инициализации переменных.
> ..
В реальных проектах, когда объекты создаются динамически, не всегда возможна инициализация. А уничтожать созданный объект нужно всегда.
Омлет (2009-11-22 14:23:00) [11]Чтобы удалить, надо сначала создать.
MyObject3 := TObject.Create;
MyObject3.Free;
sniknik (2009-11-22 14:05:00) [12]> 2. Как объяснить странное поведение при нажатии кнопки Button3?
когда читал книжку пропустил главу о инициализации переменных...
Германн (2009-11-22 13:38:00) [13]Проверь эти переменные на nil