![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Illusion Dolphin |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Всех приветствую!
Возник вопрос, но что-то не нашёл ответа. Допустим, у меня есть метод:
При заходе в метод делфи инициализирует переменные или они могут быть любыми (т.е. не nil в данном сдучае для X)? Я знаю, что поля класса очищаются нулями, но это есть поля не статические. А статические поля очищаются? Заранее спасибо! -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Делфи следит сама за обнулением всех типов автоматических объектов, кроме тех, что создаются при помощи функции GetMem или аналогичных. В этом случае требуется вызов функции Initialize для таких указателей или записей созданных через GetMem .
Вот еще ссылочка на доку на всякий случай http://docwiki.embarcadero.com/Libraries/X...stem.Initialize Это сообщение отредактировал(а) Alexeis - 2.6.2013, 19:38 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
||||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Если б это было так, то любая неинциализированная строка вызывала бы AV по выходу из функции, поскольку компилятор вставляет код подсчета ссылок, то он бы обращался по случайному адресу и читал оттуда. Делфи всегда вставляет код для инициализации автоматических объектов перед вызовом первой команды метода. В этом можно убедиться посмотрев ассемблерный код под отладкой или же прочитав статью справки. Добавлено через 14 минут и 18 секунд Чтобы не быть голословным. Смотрим на следующий код
И на его реализацию в ассемблере. ![]() -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
А не, вру, lea тут записывает указатель на будущий интерфейс в регистр, для передачи его функции IntfCopy в качестве параметра, а адрес по которому расположен объект, сохраняется в edx инструкцией mov edx,eax (функции возвращают результат всегда в этом регистре). В любом случае, я правильно вычислил что переменная i расположена по адресу [ebp-$08]
Это сообщение отредактировал(а) Alexeis - 2.6.2013, 21:10 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
для неавтоматических типов там мусор
для интерфейсов инициализируется в nil для строк всегда корректная строка чтобы присваивания не приводили рандомным исключениям, но строка не обязана быть пустой Добавлено через 1 минуту и 31 секунду это не статическое поле, а переменная на стеке -------------------- Обижено школьников: 8 |
|||
|
||||
| Illusion Dolphin |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Что-то забыл туда посмотреть Добавлено через 1 минуту и 15 секунд bems, а почитать про это официально есть где? -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
почитать сейчас ничего не вспомню
вообще я ниразу не видел чтобы интерфейсная ссылка была не nil, но думаю лучше всегда расчитывать что там может быть вариант как со стоками - корректная ссылка на интерфейс, но не nil если там будет совершенный мусор, то навернется даже твоя попытка инициализировать переменную, поэтому этот случай был бы багом компилера -------------------- Обижено школьников: 8 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Есть только про строки и варианты.
Но судя, по сходным принципам работы, должно также работать для динамических массивов и интерфейсов. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
А смысл вопроса в чём? В представленном коде нет никакой разницы была ли инициализирована переменная Х при входе в процедуру или не была. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| Illusion Dolphin |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Если нет гарантии nil и там может быть мусор то если Y <> Z и ссылка на мусор, в конце кода интерфейсная переменная выходит из области видимости и будет сделан _Release и мне бы не хотелось получить AV. -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: 8 Всего: 20 |
В представленном коде таких ужасов быть не может. ... оставляю на совести автора вопроса. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
_Release вызывается также при присвоении одного интерфейса другому, в том числе присвоении Nil (разумеется если внутри не Nil). Если бы там был изначально не Nil, то такое присвоение закончилось бы крахом.
Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
если Y = Z и в X мусор, то и X := GetMyInterface упадет. -------------------- Обижено школьников: 8 |
|||
|
||||
| DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: 2 Всего: 19 |
Вот, честно хотите моё мнение и опыт.
У меня есть начальник, который крайне не любит инициализировать переменные, т.к. меня в своё время по рукам за такое били(да и я бывает на разных ЯП пишу), то переменные, если в этом есть реальная необходимость(например если изначально я знаю что я в эту переменную запишу результат некой функции и только потом буду использовать, то в целом могу и не инициализировать, по сути это и будет инициализацией) я инициализирую пустой строкой, пустым указателем и т.д. Начальник этого не делает - итог, с достаточно завидной периодичностью я ловлю баги с помощью той же Eureka или любыми другими эксрасенсорными способностями, потому что иначе я никак не могу объяснить каким местом я чувствую где искать баг. А так по сути вопроса: интерфейсы всегда пустые, т.е. изначально переменная nill. Но иначе действительно будут глюки, попробуйте освободить объект, не обнуляя указатель на интерфейс - призабавнейший баг будет ) Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |