Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > C/C++: Общие вопросы > Повторный вызов деструктора


Автор: FasterHarder 26.12.20, 05:38
Всем хай! Сходу к делу без всякой разминки.
Есть класс TVector и есть у него деструктор вот такой:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        ~TVector(void)
        {
            delete[] this->data;    // уничтожаем данные
            this->data = NULL;      // не оставляем висячих указателей
            
            this->n = 0;            // данных нет, поэтому кол-во элементов стало равно 0
        }


тут вроде все легко и все работает, но в условии задачи есть такое требование:
"надо корректно обрабатывать ситуацию повторного вызова деструктора. В этом случае деструктор не должен пытаться освобождать в динамической памяти объекты повторно"

я не оч.выкупил, что требуется, но решил добавить такую проверку в деструкторе:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ~TVector(void)
        {
            if(this->n != 0)
            {
                delete[] this->data;    // уничтожаем данные
                this->data = NULL;      // не оставляем висячих указателей
            
                this->n = 0;            // данных нет, поэтому кол-во элементов стало равно 0
            }
        }


Вопрос: это нужно было сделать с деструктором или нет?) Если нет, то, что??

Автор: OpenGL 26.12.20, 06:09
Не нужно ничего делать. delete[] data и так внутри проверит на nullptr, поэтому ничего не упадёт у тебя. Тут надо решать другую проблему - как у тебя вообще получилось так, что деструктор вызывается дважды? Если ты дважды вызвал delete на одном и том же указателе, то тебе не поможет ничего, т.к. это UB. А если ты его вызываешь зачем-то руками, то см первую часть ответа.

Автор: FasterHarder 26.12.20, 06:14
Цитата OpenGL @
Тут надо решать другую проблему - как у тебя вообще получилось так, что деструктор вызывается дважды?

я нигде не писал, что деструктор у меня вызывается дважды

хинт: читать внимательно условие в 1ом посте, там все написано

Добавлено
дополню еще: у каждого экземпляра класса TVector для поля data выделяется свой участок динам.памяти, т е нет разделяемой памяти между данными векторов

не понимаю, по-моему 1ая версия деструктора вполне сойдет, там даже есть избыточность по обнулению, но это ладно...

Автор: OpenGL 26.12.20, 06:49
Цитата FasterHarder @
я нигде не писал, что деструктор у меня вызывается дважды

хинт: читать внимательно условие в 1ом посте, там все написано

Там написано "надо корректно обрабатывать ситуацию повторного вызова деструктора.". Если повторного вызова не будет, то ситуация считается очевидным образом обработанной на уровне выше. А если будет, то см. первое сообщение - поскольку ты плаваешь в азах, то ответить надо в первую очередь на те вопросы.

Цитата FasterHarder @
не понимаю, по-моему 1ая версия деструктора вполне сойдет, там даже есть избыточность по обнулению, но это ладно...

Что значит "даже"? Это единственное, что там есть, и это мелочь. Возможно, даже тупо if дольше будет выполняться, чем эти обнуления - мало ли, как предсказатель ветвлений сработает. А падения или прочей фигни всё равно не будет.

Автор: FasterHarder 26.12.20, 07:03
Цитата OpenGL @
даже тупо if дольше будет выполняться, чем эти обнуления

1ая версия деструктора не содержит if!!
хинт: читать и перечитывать внимательно посты выше, хотя, думаю, не стоит
вопрос зыкрыт.

зы: плавать ты меня точно не научишь, даже не пытайся

Автор: OpenGL 26.12.20, 09:55
Цитата FasterHarder @
зы: плавать ты меня точно не научишь, даже не пытайся

Да, научить не смогу, тут не во мне проблема :no-sad:

Автор: Wound 26.12.20, 19:02
Цитата FasterHarder @
надо корректно обрабатывать ситуацию повторного вызова деструктора. В этом случае деструктор не должен пытаться освобождать в динамической памяти объекты повторно

Сама по себе ситуация повторного вызова деструктора на одном и том же объекте - уже является ошибкой. Это значит, что например ты сделал 2 раза delete одному и тому же объекту. Как можно корректно обрабатывать эту ситуацию в деструкторе то? :D Раз ты второй раз попал в деструктор одного и того же объекта - это уже ошибка, и ошибка на уровне выше, а не в деструкторе.

Автор: Black_Dragon 28.12.20, 10:03
Постановщик задачи уже наступал на грабли вызова деструктора дважды.
Опыт отсюда не вынес...
По этому, поставил такое условие.

Имхо... Выполнить условия не сложно... Но с таких подходом, в коде может быть очень много "багов", которые надо вот таким образом подстраховывать... Но все косяки не предугадаешь...

Автор: Qraizer 29.12.20, 17:14
Цитата FasterHarder @
тут вроде все легко и все работает, но в условии задачи есть такое требование:
"надо корректно обрабатывать ситуацию повторного вызова деструктора. В этом случае деструктор не должен пытаться освобождать в динамической памяти объекты повторно"
При таких входных данных за задачу лучше вообще не браться. По ходу, автор задачи просто не в теме. Вообще. Неизвестно, что ему ещё в голову взбредёт.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)