MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
Миф №14: Obj.Free не приводит к Obj = nil
06.10.2015
10:46
Раздел: Компьютер - Windows - Архитектура Windows - Архитектура памяти в Windows: мифы и легенды

Миф №14: Obj.Free не приводит к Obj = nil

Если вы работали с объектами, то знаете, что одним из способов удалить объект - это вызывать метод Free, который проверит ссылку объекта и вызовет его деструктор. Правда ли, что после этого ссылка объекта не изменяется и продолжает указывать на бывший объект?

Это очень легко проверить:



1

2

3

4

5

6

7

8

9

procedure TForm1.Button1Click(Sender: TObject);

var

  O: TObject;

begin

  O := TObject.Create;

  O.Free;

  if Assigned(O) then

    ShowMessage('O <> nil');

end;


Запустите её - и вы получите сообщение.

Почему так происходит? Ну, об этом можно догадаться. Free - это метод объекта. Да, в него передаётся указатель на объект, как и в любой другой метод (далее, в методе, этот указатель становится Self) - но передаётся по значению. Иными словами, Self := nil внутри Free не изменит O - ведь любые изменения в параметре, переданном по значению, не влияют на исходное значение параметра. Free не может изменить O даже теоретически.

Если бы это было не так, то вызов конструктора для создания объекта мог бы быть таким:


1

O.Create;

Если бы изменения в Self влияли бы на исходное значение, то подобный вызов мог бы создать объект и записать ссылку в O. Но вместо этого мы пишем:


1

O := TObject.Create;

Что означает создание объекта и запись ссылки в переменную.

Так же и с освобождением объекта: если вы хотите об-nil-ить ссылку - передавайте её по ссылке (в FreeAndNil):


1

FreeAndNil(O);

FreeAndNil освободит объект и присвоит O в nil. Я уже упоминал, что FreeAndNil является самым правильным вариантом освобождения объекта из трёх (вызов деструктора Destroy, вызов прослойки Free и вызов FreeAndNil).

Статус мифа: confirmed.

Так же в этом разделе:
← Содержание ...
 
MyTetra Share v.0.35
Яндекс индекс цитирования