![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Есть объект, которому вызываем деструктор)
Можно ли после этого заново вызвать конструктор для объекта и использовать с новыми параметрами? Повторно инициализировать и использовать объект pr2? Нужно создать динамический массив объектов, толкать в него объекты, ненужные удалять, при этом забивать в освободившиеся ячейки новые объекты, поэтому такой вопрос. |
|||
|
||||
superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 7 Всего: 15 |
Нажми на FreeAndNil с зажатым контролом и посмотри как он устроен. Destroy перед FreeAndNil делать не надо, он в нем вызовется.
У уничтоженного объекта, ничего вызвать нельзя - его нет. И вообще вызывать конструктор у уже созданного объекта тоже незачем. А переменной pr2 можешь присвоить новый созданный объект, тут проблем нет. Возможно тебе сгодиться TObjectList. |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Переменная объекта в делфи это указатель. Указатель можно инициализировать сколько угодно раз уничтожая объект или нет. Например форма уничтожает дочерние компоненты сама. Указатель это просто 4 байта. Адрес, который указывает на данные которые хранятся в другом месте. Обычная ячейка памяти как например переменная типа integer. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
boobie |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Похоже, что нет. Я в деструктор затолкал Messagebox, при вызове FreeAndNil, он не вылетает. Дело в том, что внутри объекта есть другие объекты, которые нужно освободить. Это я делаю в деструкторе, присваивая каждому nil. Динамическим массивам задаю длину в 0. Что-то я не уверен, что FreeAndNil сделает все это без моего деструктора, а сборщик мусора повел себя странно при работе с таймером (складывалось впечатление, что он не успевает подчищать). В общем, сейчас делаю так:
Если надо использовать для другого нового объекта, то дальше
|
||||||
|
|||||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Так что FreeAndNil вызывает ваш деструктор, поскольку он виртуальный, будет вызван именно ваш деструктор. Динамические массивы/строки/интерфейсы это управляемые типы, которые деструктор сам уничтожает. Если ваш дейструктор не вызывается, то вероятно он как-то неверно описан. Правильное описание деструктора destructor Destroy; override; -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
||||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Компилятор должен был выдать предупреждение по идее. Только inherited нужно в конструкторе для вызова конструктора предка. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Вроде, можно не указывать, если наследуешь от TObject. Если нужно из динамического массива удалить объект (элемент i), то вызываем для объекта FreeAndNil, затем выполняем сдвиг (mas[a]:=mas[a+1]) в цикле от i+1 до конца массива (length-1) , затем вызываем setlength(mas,length-1). Все верно? А проще никак, т.е. если массив длинный, то и перебрать его придется от удаляемого элемента до конца? При присвоении в элемент, который пережил FreeAndNil, ошибки не будет? Это сообщение отредактировал(а) boobie - 2.4.2016, 14:28 |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Да, они пустые. Достаточно просто уничтожить объект, а потом вызвать http://docwiki.embarcadero.com/Libraries/S...n/System.Delete Но для хранение объектов удобнее использовать TObjectList http://docwiki.embarcadero.com/CodeExample...ctList_(Delphi) С ним код будет намного проще и интуитивнее. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |