Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];

Вниз

Бывают ли объекты с self=nil?   Найти похожие ветки 

 
Bless ©   (2005-07-04 16:07) [0]

Посмотрел в модуле system реализацию метода TObject.Free:


procedure TObject.Free;
begin
 if Self <> nil then
   Destroy;
end;


Что, разве могут быть случаи, когда Self=nil?


 
begin...end ©   (2005-07-04 16:16) [1]

> Bless ©   (04.07.05 16:07)

> Что, разве могут быть случаи, когда Self=nil?

TObject(nil).Free


 
Гаврила ©   (2005-07-04 16:17) [2]

Var
MyObj: TMyObj;
...
MyObj:=nil;
MyObj.SomeMethod;

внутри SomeMethod Self как раз будет равен nil


 
-=XP=- ©   (2005-07-04 16:17) [3]

TObject(nil).Free;


 
Stakan ©   (2005-07-04 16:17) [4]

Бывают.
var
 O: Tobject;
begin
 O := nil;
 O.Free;
end;


 
isasa ©   (2005-07-04 16:18) [5]

на самом деле точка входа в метод описывается как
procedure TObject.Free(self: pointer);
т.е. self не глобальная переменная.


 
Stakan ©   (2005-07-04 16:18) [6]

Не успел :(


 
Гаврила ©   (2005-07-04 16:19) [7]

В дополнение
SomeMethod должен быть статическим. Иначе мы туджа не попадем - вывалимся при попытке определения адреса в VMT.
В принципе, такая ситуация (в случае статичесмкого метода) может быть нормальной. Разумеется ,в жтом случае нельзя обращаться к полям объекта и вызывать виртуальные (динамические) методы.


 
begin...end ©   (2005-07-04 16:19) [8]

> Гаврила ©   (04.07.05 16:17) [2]

> внутри SomeMethod Self как раз будет равен nil

Уточнение: если SomeMethod не является классовым методом.


 
Bless ©   (2005-07-04 17:04) [9]

Спасибо


 
Игорь Шевченко ©   (2005-07-04 17:42) [10]


>  Бывают ли объекты с self=nil?


Не бывают.


 
ANB ©   (2005-07-04 17:59) [11]


> Игорь Шевченко ©   (04.07.05 17:42) [10]

Хм. А Self можно в методе присвоить nil, тогда получится . . .


 
Digitman ©   (2005-07-04 18:03) [12]


> А Self можно в методе присвоить nil, тогда получится


если долго дрючиться, то что-нибудь обязательно получится.


 
Игорь Шевченко ©   (2005-07-04 18:16) [13]

ANB ©   (04.07.05 17:59) [11]


> Хм. А Self можно в методе присвоить nil, тогда получится
> . . .


Не получится.


 
Гаврила ©   (2005-07-04 19:46) [14]

Не получится потому ,что эта ссылка передается по значению (см. [5]).
то есть присвоить то можно, только эффекта от этого за границами метода не будет


 
Kerk ©   (2005-07-04 21:59) [15]

rocedure TForm1.FormCreate(Sender: TObject);
var
 MyProc: procedure of object;
begin
 TMethod(MyProc).Code := @TForm1.Test;
 TMethod(MyProc).Data := nil;
 MyProc;
end;

procedure TForm1.Test;
begin
 if Self = nil then MessageBox(0,0,0,0);
end;


 
evvcom ©   (2005-07-05 08:26) [16]

Как уже было сказано мастерами объектов с Self = nil не бывает. Если Self = nil, то очевидно объекта уже (или еще) нет. Во всяком случае указателя на объект точно нет. А все эти извращения вокруг TObject(nil).SomeMethod это именно извращения. В методе Free сделали такую проверку, наверное, из-за того что существует такое: FreeAndNil. Хотя, кто их знает, кому это вообще пригодилось? У меня есть четкое правило, кто вызывает конструктор, тот вызывает и деструктор. Ну, за малыми исключениями. И никаких повторных вызовов Free.


 
Anatoly Podgoretsky ©   (2005-07-05 08:38) [17]

evvcom ©   (05.07.05 08:26) [16]
из-за того что существует такое: FreeAndNil

Наоборот, эту нетипизираную функцию сделали после для любителей повторного использования объектоа, спекулируя на способности Free проверять на nil.


 
Игорь Шевченко ©   (2005-07-05 11:08) [18]

Kerk ©   (04.07.05 21:59) [15]

Что ты этим хочешь сказать ? Где объект, у которого Self равен nil ?


 
Kerk ©   (2005-07-05 11:37) [19]

Игорь Шевченко ©   (05.07.05 11:08) [18]
Где объект, у которого Self равен nil ?


А объект тут причем?

> Что, разве могут быть случаи, когда Self=nil?

Да. Могут.


 
Игорь Шевченко ©   (2005-07-05 11:40) [20]

Kerk ©   (05.07.05 11:37) [19]


> А объект тут причем?


при сабже, дружище, при сабже.


> > Что, разве могут быть случаи, когда Self=nil?
>
> Да. Могут.


Могут. При некорректном коде, например.


 
Anatoly Podgoretsky ©   (2005-07-05 11:43) [21]

Но объекта то все равно не будет.


 
Kerk ©   (2005-07-05 11:44) [22]

Игорь Шевченко ©   (05.07.05 11:40) [20]
> А объект тут причем?
при сабже, дружище, при сабже.


В сабже сама постановка вопроса имхо некорректна. Нету у объектов никаких Self. Self есть у методов, как один из параметров. И он может быть nil.


 
Игорь Шевченко ©   (2005-07-05 11:48) [23]


>  Нету у объектов никаких Self. Self есть у методов, как
> один из параметров. И он может быть nil.


Так так-таки, стало быть, и нету ? (с)


 
Kerk ©   (2005-07-05 11:53) [24]

Игорь Шевченко ©   (05.07.05 11:48) [23]

TObject.Self ?


 
isasa ©   (2005-07-05 12:03) [25]

Цитата из help


Methods use the same calling conventions as ordinary procedures and functions,
except that every method has an additional implicit parameter Self,
which is a reference to the instance or class in which the method is called.
The Self parameter is passed as a 32-bit pointer.

Under the register convention, Self behaves as if it were declared before all other parameters.
It is therefore always passed in the EAX register.

Under the pascal convention,
Self behaves as if it were declared after all other parameters
(including the additional var parameter sometimes passed for a function result).
It is therefore pushed last, ending up at a lower address than all other parameters.

Under the cdecl, stdcall, and safecall conventions,
Self behaves as if it were declared before all other parameters, but after the additional
var parameter (if any) passed for a function result.
It is therefore the last to be pushed, except for the additional var parameter.


 
Игорь Шевченко ©   (2005-07-05 12:05) [26]

Kerk ©   (05.07.05 11:53) [24]


> TObject.Self ?


TObject


 
Kerk ©   (2005-07-05 12:08) [27]

Игорь Шевченко ©   (05.07.05 12:05) [26]

Подмена понятий.


 
Anatoly Podgoretsky ©   (2005-07-05 12:23) [28]

Чего спорить то, вопрос четко поставлен "Бывают ли объекты с self=nil?", таких не бывает даже с другими вариантами, поскольку Self всего лишь неявный параметр метода и не может быть применено к объекту. Даже если смотреть с точки зрения параметров, но таких объектов в природе не существует.

Остальное только от желания потрепаться.


 
Kerk ©   (2005-07-05 12:26) [29]

Anatoly Podgoretsky ©   (05.07.05 12:23) [28]
поскольку Self всего лишь неявный параметр метода и не может быть применено к объекту.


о! :)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.01 c
1-1120544996
vitge
2005-07-05 10:29
2005.07.25
Нужно определить количество часов заключенных в ТDATETIME


14-1120230990
alpet
2005-07-01 19:16
2005.07.25
True multitasking :)


6-1113550613
X-Disa
2005-04-15 11:36
2005.07.25
Проверка коннекта


1-1120646620
Demidoff
2005-07-06 14:43
2005.07.25
Есть ли в Delphi компонент по работе с архивами?


4-1117344959
NikNet
2005-05-29 09:35
2005.07.25
Как получить адресс строкий? Const MyStr:String = Hello! ;





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