![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
sptim |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 11.8.2009 Репутация: нет Всего: нет |
Добрый день!
Обращаюсь к знатокам, сам пишу на Делфи только в рамках сопровождения старых проектов и тут намедни поймал очень удививший меня баг. Ниже я специально набросал микро-тест воспроизводящий эту ситуацию:
Параметры среды: Delphi7, оптимизации отключены, WinXP sp2 32bit. Причем, если заменить Int64 на Integer - ошибок не будет (!). Т.е. это какой-то косяк компилятора (работа со стеком при Int64 аргументах)? Пробовал в инете поискать - ничего не нагуглилось. Может я чего-то недопонимаю - тогда буду благодарен за объяснение. |
|||
|
||||
dnek |
|
|||
Новичок Профиль Группа: Участник Сообщений: 0 Регистрация: 1.4.2013 Репутация: нет Всего: нет |
Не знаю поможет или нет, но правильнее было бы написать
Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
kami |
|
||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Переменная, содержащая экземпляр класса - это уже указатель.
Поэтому объявление абсолютно излишне. Таким образом вы декларируете "указатель на указатель". Сам Result в вашем коде содержит валидный указатель на область памяти, в которой должен содержаться указатель на экземпляр класса. Вот только компилятор не знает о том, что участок памяти, на который ссылается ваш указатель, нельзя модифицировать. Чтобы сказать ему об этом - необходимо явно зарезервировать область памяти, т.е. сделать
В противном случае возможны вот такие неочевидные казусы. При этом нельзя забывать правило: если что-то выделил/создал - не забудь его удалить! (антипод New - процедура Dispose). Повторюсь - в вашем случае объявление PTest1 излишне. Так стоит поступать при динамическом создании record-ов, но никак не экземпляров классов. Преобразуйте свой код так, чтобы он возвращал себя же (компилятор нормально переваривает указание типа класса внутри самого класса):
И не забудьте про высвобождение ресурсов:
|
||||||
|
|||||||
dnek |
|
|||
Новичок Профиль Группа: Участник Сообщений: 0 Регистрация: 1.4.2013 Репутация: нет Всего: нет |
Проблема здесь заключается не в PTest1 и не в Result (с ним как раз все в порядке и выделять память под него не надо). В данном примере проблема в строке
Ведь Self - это неявный параметр метода и, как и для остальных параметров, память для него выделяется при обращении к методу, а высвобождается при выходе из него. Т.е. Вы возвращаете указатель на переменную, которая существует только в теле метода и, соответственно, после его выполнения по этому адресу уже ничего нет. Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |