Форум: "Начинающим";
Текущий архив: 2010.01.24;
Скачать: [xml.tar.bz2];
ВнизМетод Free Найти похожие ветки
← →
DW © (2009-11-22 13:36) [0]Непонятно поведение метода 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?
Спасибо.
← →
Германн © (2009-11-22 13:38) [1]Проверь эти переменные на nil
← →
sniknik © (2009-11-22 14:05) [2]> 2. Как объяснить странное поведение при нажатии кнопки Button3?
когда читал книжку пропустил главу о инициализации переменных...
← →
Омлет © (2009-11-22 14:23) [3]Чтобы удалить, надо сначала создать.
MyObject3 := TObject.Create;
MyObject3.Free;
← →
DW © (2009-11-22 14:34) [4]
> когда читал книжку пропустил главу о инициализации переменных.
> ..
В реальных проектах, когда объекты создаются динамически, не всегда возможна инициализация. А уничтожать созданный объект нужно всегда.
← →
Германн © (2009-11-22 14:39) [5]
> DW © (22.11.09 14:34) [4]
>
>
> > когда читал книжку пропустил главу о инициализации переменных.
>
> > ..
>
> В реальных проектах, когда объекты создаются динамически,
> не всегда возможна инициализация. А уничтожать созданный
> объект нужно всегда.
Так ты понял разницу между двумя первыми и третьим твоим примером?
← →
DW © (2009-11-22 14:58) [6]
> Так ты понял разницу между двумя первыми и третьим твоим
> примером?
В первых двух случаях указатель на объект был nil. В третьем почему-то нет.
← →
Германн © (2009-11-22 15:02) [7]
> В третьем почему-то нет.
Вот об этом и сказано в sniknik © (22.11.09 14:05) [2]
Глобальные переменные и поля классов автоматически инициализируются нолями при старте приложения. А локальные переменные ты должен при необходимости обнулять сам.
← →
MBo © (2009-11-22 15:03) [8]>В третьем почему-то нет.
Потому что переменная локальная, а они не инициализируются нулями
← →
Германн © (2009-11-22 17:01) [9]
> DW © (22.11.09 13:36)
Да и еще одно маленькое добавление.
> Почему Free не выдает ошибку, если мы его вызываем, когда
> объект еще не создан?
В двух первых примерах до вызова метода Free дело реально не доходит. Перед вызовом происходит неявная проверка ссылки на nil и поскольку ссылка нулевая, то вызов не производится.
← →
Ухарь (2009-11-22 17:04) [10]
> В двух первых примерах до вызова метода Free
Destroy, а не Free
← →
Германн © (2009-11-22 17:10) [11]
> Destroy, а не Free
Согласен.
← →
~AQUARIUS~ © (2009-12-04 13:37) [12]Нет, все-таки Free - Free и так вызывает Destroy
← →
korneley © (2009-12-04 14:09) [13]Один человек прыгал с парашютом. И никогда не дёргал "кольцо", т.к. автомат за 300м до Земли и сам срабатывал. И тогда он подумал: "А что, если без этого рюкзака за спиной прыгнуть?"
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.01.24;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c