| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Самоудаление объекта (delete this) |
| Автор: BabySG 4.10.2005, 22:00 | ||
Собственно: имеется примерно такое
Так вот, стоит вопрос: при выполнении определенных условий, объект класса Derived может захотеть удалиться. Где это лучше сделать? В точке А или точке Б? PS. В Derived::a() ОБЯЗАТЕЛЬНО в конце должна вызваться функция базового... |
| Автор: __Sergey__ 4.10.2005, 23:26 | ||
я балдею! когда это было, чтобы объект действовал "по своему усмотрению", а не так как его запрограммировали. или я чего-то не понял, или формулируй вопрос правильно а вообще-то весьма жутковатая схема построения классов ;) |
| Автор: np9mi7 5.10.2005, 00:12 | ||
| Попытка удаление самого себя - ошибка проектирования; Лучше напиши некое подобие владельца объекта, который бы смотрел на то чем владеет и принимал решение об удалении; Вообще не понятен кусок кода:
|
| Автор: Mayk 5.10.2005, 06:53 |
| Чур меня чур. Точка А в данном контексте эквивалентна точке Б. А вообще ничего, что после освобождения состояние памяти будет неопределено и вызов Base::a() может закончится крахом? |
| Автор: BabySG 5.10.2005, 07:56 | ||||||
http://forum.vingrad.ru/index.php?showtopic=53760&hl=delete+this Добавлено @ 07:57
К примеру - есть окно, при нажатии на кнопку закрытия окна окно должно закрыться. |
| Автор: np9mi7 5.10.2005, 07:59 | ||
|
| Автор: BabySG 5.10.2005, 07:59 | ||||||||||
См. мой ответ по поводу владельца выше. А насчет ABC::destroy() Выглядит на самом деле так:
Рассматривался вопрос недалеко тут в форуме... Добавлено @ 08:01
В данном случае равнозначно удалению. Нужно освободить память - так как таких окон много. |
| Автор: Mayk 5.10.2005, 08:22 | ||||||
http://google.com. мы будем обсуждать вопрос или раскидываться ссылками без объяснений что к чему? Смотрим по данной ссылке:
Base::a() обратится к какой-нить ф-ции из виртальной таблицы и "здравствуй дебагер"
Ну так освобождай в конце ф-ции. После вызовы base::a, или вне ф-ции. |
| Автор: BabySG 5.10.2005, 15:13 | ||||||||||||
Никаких обид - текст порезался после ссылки. Привёл её к тому, что в варианте с членами-данными может еще прокатит. Вот и интересно стало - что насчет функций.
так в том-то и вопрос, что base::a должно быть последней строкой. Т.е. нужен вариант, а-ля:
, а вот так не катит:
|
| Автор: Mayk 5.10.2005, 16:16 | ||||||
Дык это тоже не катат, если нет гарантии, что base::a не обращается к данным/vtable. Прога (если повезет) просто вылетит(ибо состояние памяти не определено).
вот это выдает 0, а не 657. Что делает Base::A? Почему он должен вызываться после delete? Ведь после delete объекта уже нет. А такой вариант не пойдёт
Выглядит надо сказать уродски. |
| Автор: BabySG 5.10.2005, 21:42 |
| Решил я проблемку. В итоге получилось (на пальцах) примерно так: В ABC::Destroy() объект, который хочет удалиться, ставиться на пометку в очередь таких же. По окончанию обработки "окон", просматривается сия очередь и удаляется в тартары все из нее. В итоге: объект будет правильно удален и можно вызвать ф-ию базового класса. PS. А выглядит действительно по уродски, поэтому и не писал так раз, а два - единый стиль надо соблюсти - вызов базового обработчика всегда в конце. PPS. Спасибо за участие! |