Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
4-1227466318
demon
2008-11-23 21:51
2010.01.24
Положение рабочей части окна на экране


2-1259347319
Palalord
2009-11-27 21:41
2010.01.24
Инсталятор для своей программы


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


15-1258752615
Юрий
2009-11-21 00:30
2010.01.24
С днем рождения ! 21 ноября 2009 суббота


15-1258645461
И. Павел
2009-11-19 18:44
2010.01.24
Кпоблема с кодировками





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