|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
15.10.2014, 16:52 | #1 |
Пользователь
Регистрация: 15.08.2012
Сообщений: 39
|
Class list (вопрос по деструктору)
Здравствуйте, хочу узнать правильно ли происходит освобождение памяти (все ли освобождается, то что было выделено) с помощью деструктора.
Спасибо. Код:
Код:
Код:
|
15.10.2014, 17:03 | #2 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
пойдёт для сельской местности
|
15.10.2014, 20:16 | #3 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
2. В диструкторе стоит ненужная проверка на нуль. Её можно убрать, что б не мельтешила. Но если не убирать, компилятор скорее всего самостоятельно её выпилит. 3. Если у вас используются сырые указатели в качестве мемберов класса, значит вам нужны явные конструктор копии, и оператор= В противном случае ваш код сломается в диструкторе, если будет созданно более одного экземпляра класса через конструктор копии, или оператор= Пример: http://rextester.com/PMJ8913 Код:
|
|
16.10.2014, 15:59 | #4 |
Пользователь
Регистрация: 15.08.2012
Сообщений: 39
|
if (NextValue != 0) delete NextValue;
Это как бы проверка указывает ли NextValue на еще 1 объект типа list, то есть если не указывает (равен 0), то это конец цепочки всех объектов list (дальше уже нету объектов типа list) и смысла делать delete NextValue нету. Я могу не делать эту проверку, компилятор сам поймет то что нечего освобождать по 0 адресу? Я правильно понимаю? Спасибо. В противном случае ваш код сломается в диструкторе, если будет созданно более одного экземпляра класса через конструктор копии, или оператор= Тут будет - double free, я просто сделал пока что для 1 экземпляра) (в смысле конструктор копий и перегрузку оператора= пока не задевал, и не планировал что бы ее кто-то другой задевал. Про потоки мне еще пока рано думать (не дорос))))))). Последний раз редактировалось Stilet; 16.10.2014 в 21:28. |
16.10.2014, 16:51 | #5 | ||
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Цитата:
Цитата:
|
||
16.10.2014, 16:54 | #6 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Компилятор сам втихаря конструктор копии делает (который тупо копирует члены объекта), если программист свой вариант не сделал.
Кстати, зачем value указателем сделан? |
16.10.2014, 17:06 | #7 |
Пользователь
Регистрация: 15.08.2012
Сообщений: 39
|
Указатель типа int класса list (*Value) указывает по адресу объекта типа int (выделенного динамически в конструкторе класса list).
|
16.10.2014, 20:43 | #8 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
Если указатель нулевой, удаления не происходит. Он просто игнорируется. Поэтому, нет никакого смысла ставить ещё одну проверку. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вопрос по STL. template <class Iterator> | Smitt&Wesson | C++ Builder | 8 | 05.06.2014 10:03 |
Делфи: выдает ошибку "Project raised exception class EstringListError wits message 'list index out of bounds (-1)' | Катерина19 | Помощь студентам | 1 | 15.04.2014 12:15 |
Не удается добавить сортировку в List Control: Error 64 error C2504: 'CHeaderCtrl' : base class undefined | vaan.sk | Общие вопросы C/C++ | 2 | 29.11.2012 09:48 |
project raised exception class estringlisterror with message list index out of bounds | obsession | Общие вопросы Delphi | 23 | 09.05.2011 01:31 |
ошибка raized exception class EListError with message 'List index out of bounds(1)'.Process stopped | SGRaptor | Софт | 0 | 22.05.2010 19:12 |