84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
|
|||||||||||
1 | |||||||||||
Правильно ли написан деструктор?02.03.2016, 13:32. Показов 1506. Ответов 18
Метки нет (Все метки)
Вопрос, правильно ли я написал деструктор. Должно удалить переменную из памяти CAR И ссылку НА CDR, но сам по себе обьект CDR не трогать.
0
|
02.03.2016, 13:32 | |
Ответы с готовыми решениями:
18
правильно ли написан код в с++? Правильно ли написан код Правильно ли написан код .cpp? Правильно ли написан класс DigitalTimeException |
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
|
|
02.03.2016, 13:43 | 2 |
Если была выделена память под CAR.bytes, то она будет потеряна
1
|
1375 / 519 / 72
Регистрация: 21.07.2015
Сообщений: 1,304
|
|
02.03.2016, 13:45 | 3 |
В чем сакральный смысл смысл этой строчки?
Если член класса нужен после удаления объекта класса, то стоит его оттуда вынести в другое место. Добавлено через 1 минуту Указатель CDR и так удалится после вызова деструктора.
1
|
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
|
|
02.03.2016, 14:25 [ТС] | 4 |
Обнулить указатель?
Я так понял что удаляя delete CAR освоболится память и удалиться указатель на него. А ссылка на cdr мне не нужна, поэтому обнулил
0
|
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
|
||||||
02.03.2016, 14:28 [ТС] | 6 | |||||
ага то есть можно вот так оставить
shmkv, сам обьект cdr мне нужен, и на него будет другой указатель, а обьект car и указатель на него не нужен.
0
|
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
|
|
02.03.2016, 14:36 [ТС] | 8 |
shmkv, Но ведь Cell содержит только ссылку на CDR, то если я обнулю указатель, с самим cdr ниего не случиться
0
|
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
|
|
02.03.2016, 14:37 | 9 |
подавая эту команду в деструкторе Вы удалите объект.
Если Вам объект нужен то можно просто обнулить указатель, как Вы сделали, а можно не обнулять, так как по завершению деструктора указатель вместе с объектом (не CAR, а class Cell ) будет удален
1
|
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
02.03.2016, 14:39 | 10 |
Обнулять указатель нужно всегда, даже в деструкторе. Это не удалит объект, естественно, но сделает указатель недействительным в явном виде. Так, что товарищ Vaderkos, правильно поступил. Однако, он допустил ошибку - обнулять указатель нужно так
CDR = nullptr; , а не так *CDR = nullptr;
1
|
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
|
||||||
02.03.2016, 14:40 [ТС] | 11 | |||||
Usaga, То есть с самого начала было как надо) Спасибо.
0
|
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
02.03.2016, 14:43 | 12 |
Сообщение было отмечено Vaderkos как решение
Решение
Vaderkos, было почти правильно. Нужно так:
CDR = nullptr; т.е. без звёздочки.
1
|
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
02.03.2016, 14:52 | 14 |
Если вы уничтожите объект, а потом обратитесь к нему, то это UB (которое может и не вызвать падения программы), а вот разыменовывание нулевого указателя вылезет сразу же. Что резко снизит количество времени затраченного на отладку.
0
|
1375 / 519 / 72
Регистрация: 21.07.2015
Сообщений: 1,304
|
|
02.03.2016, 14:58 | 15 |
Давайте не будем касаться вопросов не относящихся к теме, в частности вопросов отладки. Если есть необходимость защитить себя от типичных ошибок с указателями, то лучше их вообще не использовать в явном виде. Этому вполне способствуют средства С++11.
Добавлено через 1 минуту Ну и современные компилятор в дебаге обычно неплохо отлавливают сами такие вещи.
0
|
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
02.03.2016, 15:05 | 16 |
Обнуление указателей в теле объекта - приведение этого объекта в явно невалидную форму. Это хорошая практика и она напрямую относится к теме с деструкторами. А вот современные компиляторы и С++11 уж точно не относятся к теме.
Код деструктора освобождает ресурсы занятые объектом (delete Car) и приводит его поля в неинициализированное состояние (Car = nullptr). Тут всё правильно. Нельзя за собой мусор оставлять, даже если этот мусор - ненужный указатель указывающий "в никуда".
0
|
1375 / 519 / 72
Регистрация: 21.07.2015
Сообщений: 1,304
|
|
02.03.2016, 15:10 | 17 |
Ок. Начнем с того, что разыменование null pointer не на каждой платформе вызывает падение, это раз. Сразу после разрушения объекта его память может занять другой, который перепишет твой nullptr, это два. Хороший компилятор и отладчик надежней для этих целей, это три.
Из бессмысленного спора выйду.
0
|
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
02.03.2016, 15:29 | 18 |
Я бы не сказал, что спор бессмысленный.
Я бы не стал надеяться на хороший компилятор и на платформу, особенно, если учесть, что не у всех бывает выбор какой компилятор использовать. Обнулять указатели - практика хорошая (но не панацея, я согласен). Могу только добавить, что такая практика мне несколько раз помогала. Но я не настаиваю.
0
|
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
|
||||||||||||||||
02.03.2016, 16:05 | 19 | |||||||||||||||
Сколько же тут ошибок во всём.
0. Замени CAR и CDR на более длинные имена, а то отличие в одну букву и та посередине, Это и не читабельно и вероятность опечатки слишком большая.1. Нарушил правило пяти 2. Ты видимо не понимаешь, что тут делается Так как у твоего конструктора нет спецификатора explicit , то происходит неявное преобразование типов,Это тоже самое, что
1
|
02.03.2016, 16:05 | |
02.03.2016, 16:05 | |
Помогаю со студенческими работами здесь
19
Найти сумму ряда (правильно ли написан код?) Правильно ли написан default конструктор, инициализирующий объект нулем (0/1) Как правильно должен быть написан метод возвращающий ссылку на вектор Деструктор класса. Как правильно очистить память? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |