0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
|
||||||||||||||||
1 | ||||||||||||||||
Проблема перегрузки и деструктора18.09.2011, 19:32. Показов 2217. Ответов 17
Метки нет (Все метки)
Собственно хотел перегрузить оператор "<<" для пользовательского вывода.
Просто взял и скопировал кусок кода из написанной ранее функции вывода в функцию перегруза, все бы прекрасно, но при вызове деструктора программа крашится, без перегруза все работает отлично. Программа крашится в выдается ошибка: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) Заранее спасибо за помощь.
0
|
18.09.2011, 19:32 | |
Ответы с готовыми решениями:
17
Проблема с вызовом деструктора до конструктора копирования Должен ли хотя бы один из параметров оператора перегрузки был того же типа, что и тип, в котором этот оператор перегрузки определен Вызов деструктора использование деструктора |
программист С++
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
|
|
18.09.2011, 19:49 | 2 |
скорее всего неправильно конструктор копирования реализован
и объекты передавать лучше по константной ссылке
1
|
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
|
|
18.09.2011, 20:00 [ТС] | 3 |
конструктор копирования?
Я вроде ничего такого не реализовывал.
0
|
программист С++
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
|
|
18.09.2011, 20:01 | 4 |
вот и хреново, как видно по деструктору у вас в классе есть работа с динамической памятью, а значит надо реализовывать конструктор копирования
0
|
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
|
|
18.09.2011, 20:07 [ТС] | 5 |
Собственно, я пока даже не знаю, что такое "конструктор копирования". С++ изучаю первый день.
Вы меня не просвятите ?
0
|
программист С++
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
|
|||||||||||
18.09.2011, 20:17 | 6 | ||||||||||
конструктор, которому на вход идет один аргумент - объект того же типа, переданный по ссылке
например,
если нет явной реализации, то он создается по умолчанию. В результате все поля объекта instance будут скопированы в поля объекта *this. В случае, когда в классе нет указателей, такой вариант нас устраивает. Иначе надо вручную писать реализацию копирующего конструктора (например в случае списков, типичный пример)
1
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
18.09.2011, 20:48 | 7 |
vano468, при работе с динамической памятью обязательными для реализации являются:
1. конструктор без аргументов 2. Конструктор копирования 3. Деструктор 4. Операция присваивания. Остальное добавить "по вкусу"...
2
|
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
|
|
18.09.2011, 23:47 [ТС] | 8 |
Спасибо, нашел пример у Шилдта, буду реализовывать.
0
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
19.09.2011, 01:22 | 9 |
0
|
программист С++
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
|
|
19.09.2011, 01:25 | 10 |
потому что указатель надо инициализировать NULL'ом
1
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
19.09.2011, 09:48 | 11 |
Это тоже. Но более важная причина: при объявлении массива объектов для создания каждого элемента вызывается конструктор по умолчанию.
1
|
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
|
|||||||||||
19.09.2011, 23:11 [ТС] | 12 | ||||||||||
Написал я конструктор копирования вроде, но все равно не работает.
Посмотрите, пожалуйста, в чем ошибка: http://pastebin.com/DSx0CJep Добавлено через 2 часа 36 минут Заменил:
0
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|||||||||||
19.09.2011, 23:20 | 13 | ||||||||||
Что-то у вас не так. С конструктором копирования должен был работать вариант:
0
|
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
|
|
19.09.2011, 23:26 [ТС] | 14 |
Да, я понимаю, что во втором случае конструктор копирования не нужен.
Все же, можете посмотреть мой код и попробовать найти ошибку, она либо в констр. копирования либо в деструкторе.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
19.04.2012, 12:34 | 15 |
0
|
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
|
|
19.04.2012, 15:10 [ТС] | 16 |
Не актуально.
0
|
19.04.2012, 15:58 | 17 |
Вот кстати, не надо про то что он ОБЯЗАТЕЛЕН.
Скорее наоборот, если в программе не должно создаваться пустых объектов, отсутствие конструктора без аргументов может указать при компиляции на уязвимые места в которых неявно вызывается конструктор не того, что нам нужно.
0
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
21.04.2012, 04:05 | 18 |
Дык и операция присваивания, и конструктор копирования тоже можно закрыть. Если не требуется создавать копии объектов.
Я в книжке такое для стеков применял: зачем стеки копировать? А стек весь из себя динамический. Но про обязательность не я первый написал. Более авторитетный товарищ Джеймс Коплиен в своей книжке Advanced C++ успел раньше...
0
|
21.04.2012, 04:05 | |
21.04.2012, 04:05 | |
Помогаю со студенческими работами здесь
18
Вызов деструктора Вызов деструктора Использование деструктора Вызов деструктора Отключение деструктора Описание деструктора Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |