![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| CEMEH |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 6.7.2006 Где: Украина, Харьков Репутация: нет Всего: нет |
Смотрел я топики, где обсуждается 'delete this', но ответа на свой вопрос так и не нашел.
Есть объект, который должен удалять сам себя при условии что он создан динамически. В противном случае он себя чистит и все, а память освобождается при удалении родительского объекта. Пример:
Т.е. если не осуществлять проверку то деструктор объекта созданного в автоматической памяти будет вызван дважды delete this и компилятором. Как это решить? Это сообщение отредактировал(а) CEMEH - 6.7.2006, 12:58 |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Запретить создавать объект на стеке. Переносимого решения, как определить в какой памяти объект - не существует. Delete this - плохой стиль проектирования (не всегда правда, но в твоём случае точно) |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
А зачем тебе вообще нужен вызов delete this? Ты что, явно вызываешь деструктор ~Window()?
|
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
imho после первого delete присваивать указателю NULL. если потом будет еще раз вызван delete, то по крайней мере ничего плохого не случится. -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Поддерживаю. Пересмотри дизайн. -------------------- ... |
|||
|
||||
| CEMEH |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 6.7.2006 Где: Украина, Харьков Репутация: нет Всего: нет |
Как запретить? Если создано 1000 окон, то спрятав окно из close() я [B]не[/B ]повышу производительность. Нужно память освободить. И почему же в моем случае - точно? Кинь линк, где увидеть хороший случай!!!
Да. А что из кода не видно? Ну пусть это будет не 'delete this' а 'this->~Window()', разницы нет никакой.
Попробуй this присвоить NULL. Посмотрел бы я на это :-) |
||||
|
|||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
||||
|
||||
| Daevaorn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Закрой все конструкторы, сдалай фабрику или
Но это всё не очень хорошо. Второй вариант: сделай пустой деструктор (или только удаление childs, хотя умные указатели предпочтительней), window::remove пусть удалеят окно. Значит клиентскому коду для удалния уже ненужного окна надо вызвать всего лишь window::clean(). Надеюсь идея ясна.
Посмотри boost::shared_count, там delete this является частью элегантного решения по делегации удаления объекта сечтчика по сути пользовательскому класса. |
||||
|
|||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
а если
http://www.codeguru.com/forum/archive/inde...p/t-179284.html
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| CEMEH |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 6.7.2006 Где: Украина, Харьков Репутация: нет Всего: нет |
Всем спасибо!
|
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
CEMEH, а как решили проблему?
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Меня тоже интересует решение. |
|||
|
||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Как? |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
||||
|
||||
| Alexeis |
|
||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Как вариант перегрузить оператор new в котором заполнить некоторое поле объекта признаком что память была выделена в куче (сигнатуру хитрую записать). В самом же конструкторе проверить сигнатуру и если не совпадает вкинуть эксепшн. Это будет рантайм запрет. Еще вариант спрятать в private конструктор и всегда создавать объект в куче при помощи функции friend-a -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |