Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.14.150.55] |
|
Сообщ.
#1
,
|
|
|
Всем хай! Сходу к делу без всякой разминки.
Есть класс TVector и есть у него деструктор вот такой: ~TVector(void) { delete[] this->data; // уничтожаем данные this->data = NULL; // не оставляем висячих указателей this->n = 0; // данных нет, поэтому кол-во элементов стало равно 0 } тут вроде все легко и все работает, но в условии задачи есть такое требование: "надо корректно обрабатывать ситуацию повторного вызова деструктора. В этом случае деструктор не должен пытаться освобождать в динамической памяти объекты повторно" я не оч.выкупил, что требуется, но решил добавить такую проверку в деструкторе: ~TVector(void) { if(this->n != 0) { delete[] this->data; // уничтожаем данные this->data = NULL; // не оставляем висячих указателей this->n = 0; // данных нет, поэтому кол-во элементов стало равно 0 } } Вопрос: это нужно было сделать с деструктором или нет?) Если нет, то, что?? |
Сообщ.
#2
,
|
|
|
Не нужно ничего делать. delete[] data и так внутри проверит на nullptr, поэтому ничего не упадёт у тебя. Тут надо решать другую проблему - как у тебя вообще получилось так, что деструктор вызывается дважды? Если ты дважды вызвал delete на одном и том же указателе, то тебе не поможет ничего, т.к. это UB. А если ты его вызываешь зачем-то руками, то см первую часть ответа.
|
Сообщ.
#3
,
|
|
|
Цитата OpenGL @ Тут надо решать другую проблему - как у тебя вообще получилось так, что деструктор вызывается дважды? я нигде не писал, что деструктор у меня вызывается дважды хинт: читать внимательно условие в 1ом посте, там все написано Добавлено дополню еще: у каждого экземпляра класса TVector для поля data выделяется свой участок динам.памяти, т е нет разделяемой памяти между данными векторов не понимаю, по-моему 1ая версия деструктора вполне сойдет, там даже есть избыточность по обнулению, но это ладно... |
Сообщ.
#4
,
|
|
|
Цитата FasterHarder @ я нигде не писал, что деструктор у меня вызывается дважды хинт: читать внимательно условие в 1ом посте, там все написано Там написано "надо корректно обрабатывать ситуацию повторного вызова деструктора.". Если повторного вызова не будет, то ситуация считается очевидным образом обработанной на уровне выше. А если будет, то см. первое сообщение - поскольку ты плаваешь в азах, то ответить надо в первую очередь на те вопросы. Цитата FasterHarder @ не понимаю, по-моему 1ая версия деструктора вполне сойдет, там даже есть избыточность по обнулению, но это ладно... Что значит "даже"? Это единственное, что там есть, и это мелочь. Возможно, даже тупо if дольше будет выполняться, чем эти обнуления - мало ли, как предсказатель ветвлений сработает. А падения или прочей фигни всё равно не будет. |
Сообщ.
#5
,
|
|
|
Цитата OpenGL @ даже тупо if дольше будет выполняться, чем эти обнуления 1ая версия деструктора не содержит if!! хинт: читать и перечитывать внимательно посты выше, хотя, думаю, не стоит вопрос зыкрыт. зы: плавать ты меня точно не научишь, даже не пытайся |
Сообщ.
#6
,
|
|
|
Цитата FasterHarder @ зы: плавать ты меня точно не научишь, даже не пытайся Да, научить не смогу, тут не во мне проблема |
Сообщ.
#7
,
|
|
|
Цитата FasterHarder @ надо корректно обрабатывать ситуацию повторного вызова деструктора. В этом случае деструктор не должен пытаться освобождать в динамической памяти объекты повторно Сама по себе ситуация повторного вызова деструктора на одном и том же объекте - уже является ошибкой. Это значит, что например ты сделал 2 раза delete одному и тому же объекту. Как можно корректно обрабатывать эту ситуацию в деструкторе то? Раз ты второй раз попал в деструктор одного и того же объекта - это уже ошибка, и ошибка на уровне выше, а не в деструкторе. |
Сообщ.
#8
,
|
|
|
Постановщик задачи уже наступал на грабли вызова деструктора дважды.
Опыт отсюда не вынес... По этому, поставил такое условие. Имхо... Выполнить условия не сложно... Но с таких подходом, в коде может быть очень много "багов", которые надо вот таким образом подстраховывать... Но все косяки не предугадаешь... |
Сообщ.
#9
,
|
|
|
Цитата FasterHarder @ При таких входных данных за задачу лучше вообще не браться. По ходу, автор задачи просто не в теме. Вообще. Неизвестно, что ему ещё в голову взбредёт. тут вроде все легко и все работает, но в условии задачи есть такое требование: "надо корректно обрабатывать ситуацию повторного вызова деструктора. В этом случае деструктор не должен пытаться освобождать в динамической памяти объекты повторно" |