0 / 0 / 0
Регистрация: 22.11.2015
Сообщений: 21
|
||||||||||||||||
1 | ||||||||||||||||
Освобождение памяти динамического массива. Деструктор05.10.2016, 19:45. Показов 2791. Ответов 8
Метки нет (Все метки)
Почему выдает ошибку при написании деструктора? Если его убрать, то все работает.
0
|
05.10.2016, 19:45 | |
Ответы с готовыми решениями:
8
Освобождение памяти у динамического массива char Освобождение памяти динамического массива структур Освобождение памяти после динамического массива Деструктор: освобождение памяти |
59 / 59 / 53
Регистрация: 05.05.2013
Сообщений: 150
|
|
05.10.2016, 20:07 | 2 |
Сообщение было отмечено Ilya2016 как решение
Решение
При копировании экземпляров класса с динамически выделенной памятью необходимо явно определить конструктор копирования и оператор =
У вас фактически происходит двойное освобождение выделенной памяти, т. к. конструктор копирования по умолчанию осуществляет поверхностное копирование
1
|
Вездепух
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,877
|
|
05.10.2016, 20:12 | 3 |
Нарушено Правило Трех: отсутствует корректно реализованный копирующий оператор присваивания. Конструктор копирования есть, деструктор есть, а оператора присваивания нет. А в программе он используется...
P.S. В чем смысл метода void Matrix::get(int i, int j) , который ничего не делает - не ясно.
1
|
0 / 0 / 0
Регистрация: 22.11.2015
Сообщений: 21
|
|||||||||||
05.10.2016, 22:28 [ТС] | 4 | ||||||||||
VAN0, TheCalligrapher, Изменил. Что в это раз не так?
0
|
Вездепух
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,877
|
|
05.10.2016, 23:07 | 5 |
В операторе присваивания памяти выделяется недостаточно. Судя по конструктору
Matrix:Matrix() вы сами знаете, что выделять массив надо размера dimension*dimension , а вы в операторе присваивания выделяете только dimension . Та же проблема с конструктором копирования. Может надо как-то самому учиться отлавливать такие "детские" баги?И теперь вы зачем-то искорежили свой оператор + . В первой версии было все нормально (по крайней мере внешне), а теперь вы из оператора + вдруг ни стого ни с сего сделали некое подобие оператора += . Зачем? Почему?
1
|
0 / 0 / 0
Регистрация: 22.11.2015
Сообщений: 21
|
|||||||||||
05.10.2016, 23:47 [ТС] | 6 | ||||||||||
TheCalligrapher, Почему-то в функцию
0
|
Вездепух
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,877
|
|
06.10.2016, 00:04 | 7 |
Мне трудно представить, о чем идет речь, не видя финальной версии кода, в т.ч. вызывающего кода. Как выглядит код?
0
|
0 / 0 / 0
Регистрация: 22.11.2015
Сообщений: 21
|
||||||
06.10.2016, 00:05 [ТС] | 8 | |||||
TheCalligrapher,
0
|
Вездепух
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,877
|
|
06.10.2016, 00:11 | 9 |
Никаких проблем с
oldObject на входе в operator = я не вижу.После выхода из operator + (подразумевая, что вы вернули его к прежнему виду) вызывается деструктор временного объекта - это тоже нормально. Что такое "вызывается деструктор для this" я не понял.
0
|
06.10.2016, 00:11 | |
06.10.2016, 00:11 | |
Помогаю со студенческими работами здесь
9
Освобождение памяти для динамического масива типа char Освобождение динамического двумерного массива указателей Резервирование памяти/освобождение памяти для трехмерного массива Динамическая загрузка и освобождение памяти для двумерного массива Освобождение памяти (удаление массива char) и raised exception class EAccessViolation Как правильно записать в виде функции выделение памяти для двумерного массива и ее освобождение Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |