Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Автоматическая инициализация полей, происходит ли для методов 
:(
    Опции темы
Illusion Dolphin
Дата 2.6.2013, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Всех приветствую!

Возник вопрос, но что-то не нашёл ответа. Допустим, у меня есть метод:

Код

procedure A;
var
  X: IMyInterface;
begin 
  ...
  if (Y = Z) then
  begin
    X := GetMyInterface;
    X.DoSmth();
  end;
end;


При заходе в метод делфи инициализирует переменные или они могут быть любыми (т.е. не nil в данном сдучае для X)? Я знаю, что поля класса очищаются нулями, но это есть поля не статические. А статические поля очищаются? 

Заранее спасибо!


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 2.6.2013, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Делфи следит сама за обнулением всех типов автоматических объектов, кроме тех, что создаются при помощи функции GetMem или аналогичных. В этом случае требуется вызов функции Initialize для таких указателей или записей созданных через GetMem . 

Вот еще ссылочка на доку на всякий случай http://docwiki.embarcadero.com/Libraries/X...stem.Initialize

Это сообщение отредактировал(а) Alexeis - 2.6.2013, 19:38


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
kami
Дата 2.6.2013, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(Illusion Dolphin @  2.6.2013,  18:06 Найти цитируемый пост)
При заходе в метод делфи инициализирует переменные или они могут быть любыми (т.е. не nil в данном сдучае для X)?

могут быть (и будут) мусором.

Это сообщение отредактировал(а) kami - 2.6.2013, 20:32
PM MAIL WWW   Вверх
Alexeis
Дата 2.6.2013, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(kami @  2.6.2013,  21:32 Найти цитируемый пост)
могут быть (и будут) мусором.

  Если б это было так, то любая неинциализированная строка вызывала бы AV по выходу из функции, поскольку компилятор вставляет код подсчета ссылок, то он бы обращался по случайному адресу и читал оттуда. Делфи всегда вставляет код для инициализации автоматических объектов перед вызовом первой команды метода. В этом можно убедиться посмотрев ассемблерный код под отладкой или же прочитав статью справки.

Добавлено через 14 минут и 18 секунд
Чтобы не быть голословным. Смотрим на следующий код

Код

 {$O-}
procedure TForm1.FormCreate(Sender: TObject);
var
  i : IUnknown;
  j : integer;
begin
 J := 5;
 i := TInterfacedObject.Create;
end;


И на его реализацию в ассемблере. 

user posted image




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 2.6.2013, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



 А не, вру, lea тут записывает указатель на будущий интерфейс в регистр, для передачи его функции IntfCopy в качестве параметра, а адрес по которому расположен объект, сохраняется в edx инструкцией mov edx,eax (функции возвращают результат всегда в этом регистре). В любом случае, я правильно вычислил что переменная i расположена по адресу [ebp-$08]

Это сообщение отредактировал(а) Alexeis - 2.6.2013, 21:10


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bems
Дата 2.6.2013, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



для неавтоматических типов там мусор
для интерфейсов инициализируется в nil
для строк всегда корректная строка чтобы присваивания не приводили рандомным исключениям, но строка не обязана быть пустой

Добавлено через 1 минуту и 31 секунду
Цитата(Illusion Dolphin @  2.6.2013,  18:06 Найти цитируемый пост)
А статические поля очищаются? 
это не статическое поле, а переменная на стеке



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Illusion Dolphin
Дата 2.6.2013, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Цитата

И на его реализацию в ассемблере. 

Что-то забыл туда посмотреть smile А есть доки что так и должно быть?

Добавлено через 1 минуту и 15 секунд
bems, а почитать про это официально есть где? 


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
bems
Дата 2.6.2013, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



почитать сейчас ничего не вспомню
вообще я ниразу не видел чтобы интерфейсная ссылка была не nil, но думаю лучше всегда расчитывать что там может быть вариант как со стоками - корректная ссылка на интерфейс, но не nil
если там будет совершенный мусор, то навернется даже твоя попытка инициализировать переменную, поэтому этот случай был бы багом компилера


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Alexeis
Дата 3.6.2013, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Есть только про строки и варианты.
Цитата

For global variables, local variables, objects, and dynamic variables allocated using New, the compiler generates code that initializes all long strings and variants contained by a variable upon creation of the variable.


Но судя, по сходным принципам работы, должно также работать для динамических массивов и интерфейсов. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
northener
Дата 3.6.2013, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(Illusion Dolphin @  2.6.2013,  18:06 Найти цитируемый пост)
Возник вопрос, но что-то не нашёл ответа. Допустим, у меня есть метод:

procedure A;
var
  X: IMyInterface;
begin 
  ...
  if (Y = Z) then
  begin
    X := GetMyInterface;
    X.DoSmth();
  end;
end;

При заходе в метод делфи инициализирует переменные или они могут быть любыми (т.е. не nil в данном сдучае для X)? 

А смысл вопроса в чём?
В представленном коде нет никакой разницы была ли инициализирована переменная Х при входе в процедуру или не была.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Illusion Dolphin
Дата 3.6.2013, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Цитата

А смысл вопроса в чём?
В представленном коде нет никакой разницы была ли инициализирована переменная Х при входе в процедуру или не была. 

Если нет гарантии nil и там может быть мусор то если Y <> Z и ссылка на мусор, в конце кода интерфейсная переменная выходит из области видимости и будет сделан _Release и мне бы не хотелось получить AV.


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
northener
Дата 3.6.2013, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(Illusion Dolphin @  3.6.2013,  01:14 Найти цитируемый пост)
Если нет гарантии nil и там может быть мусор то если Y <> Z и ссылка на мусор, в конце кода интерфейсная переменная выходит из области видимости и будет сделан _Release и мне бы не хотелось получить AV. 

В представленном коде таких ужасов быть не может.
... оставляю на совести автора вопроса.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Alexeis
Дата 3.6.2013, 07:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  _Release вызывается также при присвоении одного интерфейса другому, в том числе присвоении Nil (разумеется если внутри не Nil). Если бы там был изначально не Nil, то такое присвоение закончилось бы крахом.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM ICQ Skype   Вверх
bems
Дата 3.6.2013, 21:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(Illusion Dolphin @  3.6.2013,  01:14 Найти цитируемый пост)
сли нет гарантии nil и там может быть мусор то если Y <> Z и ссылка на мусор, в конце кода интерфейсная переменная выходит из области видимости и будет сделан _Release и мне бы не хотелось получить AV. 
если Y = Z и в X мусор, то и X := GetMyInterface упадет.



--------------------
Обижено школьников: 8
PM MAIL   Вверх
DarkProg
Дата 3.6.2013, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 2
Всего: 19



Вот, честно хотите моё мнение и опыт.
У меня есть начальник, который крайне не любит инициализировать переменные, т.к. меня в своё время по рукам за такое били(да и я бывает на разных ЯП пишу), то переменные, если в этом есть реальная необходимость(например если изначально я знаю что я в эту переменную запишу результат некой функции и только потом буду использовать, то в целом могу и не инициализировать, по сути это и будет инициализацией) я инициализирую пустой строкой, пустым указателем и т.д.
Начальник этого не делает - итог, с достаточно завидной периодичностью я ловлю баги с помощью той же Eureka или любыми другими эксрасенсорными способностями, потому что иначе я никак не могу объяснить каким местом я чувствую где искать баг.

А так по сути вопроса: интерфейсы всегда пустые, т.е. изначально переменная nill. Но иначе действительно будут глюки, попробуйте освободить объект, не обнуляя указатель на интерфейс - призабавнейший баг будет )

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.