Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Для новичков > ошибка в cоздание своего класса |
Автор: blaze 10.2.2006, 07:09 | ||
подскажите, в чем ошибка? Создаю свой класс, например в модуле Unit2
Потом ссылаюсь на этот класс из другого модуля, наприме Unit1, где у меня на нажатие кнопки вызывается v.data:=123; где v - глобальная переменная в этом модуле тип ее - TMyClass; После этого события выскакивает Access Violation; Cannot write at adress .....; Нет Вы не поняли, ошибка возникает при попытке присвоения v.Data:=123 CANNOT WRITE AT ADRESS |
Автор: CaNIBaLchik 10.2.2006, 07:15 |
забыл наверное v:=TMyClass.Create; |
Автор: Bog d`An 10.2.2006, 08:44 | ||
после работы тоже неплохо бы освободить память...
|
Автор: Bose 10.2.2006, 10:44 | ||
|
Автор: Bog d`An 10.2.2006, 13:48 |
шо в лоб, шо по лбу |
Автор: CaNIBaLchik 13.2.2006, 08:14 |
ага а также destroy можно dispose тоже сработает ![]() |
Автор: Bog d`An 13.2.2006, 08:24 |
в литературе рекомендуют использовать free |
Автор: CaNIBaLchik 13.2.2006, 08:31 |
только потому что перед destroy там идет проверка на nil |
Автор: s-r 31.5.2007, 08:21 | ||||||
у меня аналогичная ситуация
В обработчике по клику:
код отрабатывает, но после закрытия формы вываливается исключение.. проблема решилась так
Может поскажите какая разница между cr.Create и cr:=TCirc.Create? и зачем это нужно делать, и почему если это не сделать возникает ошибка... прошу прощения если задаю глупые вопросы |
Автор: MetalFan 31.5.2007, 08:38 | ||||
можно написать так:
хм... как интересно получается... вроде как нельзя обращаться к объекту, который еще не создан. но ведь такой код является верным:
т.е. во Free произойдет проверка Self <> nil и выход. но ведь объект еще не создан/уже разрушен.... или TObject весь такой особенный, что позволяет это делать. или если нет обращения к внутренним полям класса, то вызов методов несозданного объекта все-таки возможен? ))) |
Автор: Yanis 31.5.2007, 08:45 | ||||||||||||||
Должна быть ошибка ![]()
Да, он такой особенный ;) Не помню как точно называется. Классовые методы или что то подобное. Они объявляются так:
т.е. её можно вызывать без выделения памяти под экземпляр:
Вот так работает Create. Добавлено @ 08:47 Для тех, кто в танке:
|
Автор: MetalFan 31.5.2007, 08:53 |
Free - это не class procedure.... только что посмотрел) но вызов Free без дополнительной проверки на nil возможен и не приводит к AV.... |
Автор: Yanis 31.5.2007, 09:08 | ||||
Ага. По всей видимости ошибка начинает возникать после того как в методе начинается работа с переменными класса. Если таковых нет, то всё работает ![]()
|
Автор: MetalFan 31.5.2007, 09:19 |
мда.. а зачем тогда Class functions?... может отдельную тему сказать, вдруг мастера знают секрет этого фокуса? ))) |
Автор: pseud 31.5.2007, 09:25 | ||||
blaze, Раз v - глобальная переменная, то в модуле Unit1, как я понимаю это форма TForm1, код должен быть такой:
|
Автор: Yanis 31.5.2007, 09:36 |
Тада компилятор не даст нам использовать внутренние переменные в этих методах ![]() Добавлено через 6 минут и 38 секунд Оказывается всё это прокатывает без AV, потому что методы статические. Компилятор их помнит без напоминания. Спасибо Розычу. |
Автор: Alexeis 31.5.2007, 09:49 | ||
А чего в этом такого? С точки зрения реализации метод это обычная процедура в которую первым параметром передается указатель на объект. Если к данным не обращаться, то с чего будут возникать AV? Проверил Self на nil и вперед, если он не nil то VMT существует и можно без проблем вызывать Destroy. Напрямую вызов Destroy, у несуществующего объекта приведет к AV так как Destroy - это виртуальный метод (иногда даже динамический), т.е. поиск его адреса будет осуществляться в VMT, ссылка на которую отсутствует в уничтоженном объекте. |
Автор: Yanis 31.5.2007, 09:51 |
в несуществующем ![]() Добавлено через 18 секунд или «не созданном». |
Автор: Rennigth 31.5.2007, 10:17 |
Yanis, MetalFan, http://forum.vingrad.ru/forum/topic-115603.html |
Автор: Alexeis 31.5.2007, 10:23 |
Там есть одна неточность Уточню, любые статические (статические в делфиском смысле, т.е. не виртуальные и не динамические). |
Автор: MetalFan 31.5.2007, 10:46 |
отлично) разобралис) всем спасибо! |
Автор: Yanis 31.5.2007, 14:44 | ||
![]() |