![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
ну и я уверен
десткутор вызовется два раза, к чему это приведет зависит от каждого конкретного деструктора, но ясно, что делать так не надо! |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Компилятор такая штука, капризная, поэтому такие вещи лучше не делать
|
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Rockie |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
поэтому после очистки памяти указатель надо занулять.
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
||||
|
|||||
| archimed7592 |
|
||||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
как видишь - деалокация происходит дважды... т. о. в зависимости от реализации менеджера памяти могут быть и утечки и исключения и че душе угодно... так делать нельзя (!) Добавлено через 2 минуты и 35 секунд не лучшее решение как раз таки без занулённого указателя с включенным дебаг-менеджером памяти ругнётся и ошибку можно будет найти на этапе разработки... с занулённым - ругаться права не имеет... и ошибка выявится хз когда -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
||||||
|
|||||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
никогда не выявится, так как это не ошибка. -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
с точки зрения IS - да, это не ошибка...
с архитектурной точки зрения - ещё какая -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
archimed7592, согласен. Указатель будет указывать на область памяти, где БЫЛ обьект. После уничтожения обьекта эта область может быть задействована под что-нибудь другое(к примеру системный процесс). И если повторно заюзать delete, то может случиться ОЙ. Применение же delete к зануленному указателю безопасно, поэтому если есть опасность повторного вызова delete, то указатель лучше занулять
Чем-то похожим вроде занимаются умные указатели.. -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Согласна. Несмотря на то, что удалять нулевой указатель - не ошибка, зато ошибка - дважды вызывать деструктор. И ты не имеешь права надеяться, что в уже разрушенном объекте будет ноль на месте указателя - даже если в конкретном примере это получается именно так. Главное, абсолютно непонятно, ЗАЧЕМ вызывать деструктор руками? Если обязательно нужно что-то разрушить (освободить память) ДО выхода из функции - то можно а) заключить переменные в блок б) написать какой-нибудь Destroy, который и будет освобождать то, что нужно, и обнулять. -------------------- ... |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
дело больше не в том, что освобождается там память или нет, а в том, что, во-первых, если такое произошло - это уже очень плохое проектное решение(кроме редких случаев с отдельным коментарием - тех же smartpointers)...
во-вторых, в деструкторе может делаться что угодно и дважды его вызывать не нужно из тех же соображений, что и не нужно писать asm-вставки просто так, из тех же, что и не нужно писать myClass obj; delete &obj;, даже, если здесь и сейчас это работает... -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |