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

Вниз

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

Наверх




Память: 0.5 MB
Время: 0.012 c
2-1260099635
evger
2009-12-06 14:40
2010.01.24
Треды в дельфи


2-1259737915
Timur&Co
2009-12-02 10:11
2010.01.24
Подсчет итемов ListView


2-1259683856
SergP
2009-12-01 19:10
2010.01.24
This form of method call only allowed for class methods


1-1230566193
alek_1
2008-12-29 18:56
2010.01.24
Rave Report проблема с кирилицей в ПДФ


15-1258407522
K-one
2009-11-17 00:38
2010.01.24
Const Массив