Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
1

Проблема перегрузки и деструктора

18.09.2011, 19:32. Показов 2214. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно хотел перегрузить оператор "<<" для пользовательского вывода.
Просто взял и скопировал кусок кода из написанной ранее функции вывода в функцию перегруза, все бы прекрасно, но при вызове деструктора программа крашится, без перегруза все работает отлично.
Программа крашится в выдается ошибка: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
Заранее спасибо за помощь.
C++
1
2
3
4
5
6
// Функция вывода
void FreeInt::PrintFreeInt()
{
    for (Current = Tail; Current; Current = Current->Prev)
        cout << Current->Number;
}
C++
1
2
3
4
5
6
7
// Перегрузка оператора "<<"
ostream &operator<<(ostream &stream, FreeInt o)
{
    for (o.Current = o.Tail; o.Current; o.Current = o.Current->Prev)
        stream << o.Current->Number;
    return stream;
}
C++
1
2
3
4
5
6
7
8
9
// Деструктор
FreeInt::~FreeInt()
{
    for (Current = Head; Current != NULL; Current = Head)
    {
        Head = Head->Next;
        delete Current;
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2011, 19:32
Ответы с готовыми решениями:

Проблема с вызовом деструктора до конструктора копирования
Господа, возникла проблема в реализации объединения двух векторов. В конце оператора присваивания...

Должен ли хотя бы один из параметров оператора перегрузки был того же типа, что и тип, в котором этот оператор перегрузки определен
A) В зависимости от перегружаемой операции B) Нет C) Да D) В зависимости от типа, в котором...

Вызов деструктора
Доброго вам времени суток. Проблема в том, что деструктор не выводит сообщение без этой строки....

использование деструктора
в .net, насколько помню, не рекомендуется использовать деструктор для освобождения неуправляемых...

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
конструктор, которому на вход идет один аргумент - объект того же типа, переданный по ссылке
например,
C++
1
value_type(const value_type& instance)
его задача - создать копию переданного по ссылке объекта
если нет явной реализации, то он создается по умолчанию. В результате все поля объекта instance будут скопированы в поля объекта *this. В случае, когда в классе нет указателей, такой вариант нас устраивает.
Иначе надо вручную писать реализацию копирующего конструктора (например в случае списков, типичный пример)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class value_type
{
   int* ptr;
   unsigned int size;
public:
   value_type(unsigned int size) 
   {
      ptr = new int[size];
   }
   
   value_type(const value_type& instance) :
      size(instance.size)
   {   
      ptr = new int[size];
      for (unsigned int i = 0; i < size; ++i)
         ptr[i] = instance.ptr[i];
      
      /* если бы не реализовали явно конструктор копирования, то компилятор сгенерировал бы такой код
      size = instance.size;
      ptr = instance.ptr;
      явно не то, что нужно*/
   }
}
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
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
1. конструктор без аргументов
С 2,3,4 понятно, а 1 почему?
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
Цитата Сообщение от sandye51 Посмотреть сообщение
потому что указатель надо инициализировать NULL'ом
Это тоже. Но более важная причина: при объявлении массива объектов для создания каждого элемента вызывается конструктор по умолчанию.
1
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
19.09.2011, 23:11  [ТС] 12
Написал я конструктор копирования вроде, но все равно не работает.
Посмотрите, пожалуйста, в чем ошибка:
http://pastebin.com/DSx0CJep

Добавлено через 2 часа 36 минут
Заменил:
C++
1
ostream &operator << (ostream &stream, FreeInt obj)
на это
C++
1
ostream &operator << (ostream &stream, FreeInt &obj)
И все стало работать и с конструктором копирования и без него.
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
19.09.2011, 23:20 13
Что-то у вас не так. С конструктором копирования должен был работать вариант:
C++
1
ostream &operator << (ostream &stream, FreeInt obj)
А этому варианту вообще не нужен конструктор копирования:
C++
1
ostream &operator << (ostream &stream, FreeInt &obj)
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
Цитата Сообщение от vano468 Посмотреть сообщение
http://pastebin.com/DSx0CJep
Ссылка нерабочая. Выложите код на форум (в виде текста).
0
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
19.04.2012, 15:10  [ТС] 16
Не актуально.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,492
Записей в блоге: 1
19.04.2012, 15:58 17
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
1. конструктор без аргументов
Вот кстати, не надо про то что он ОБЯЗАТЕЛЕН.
Скорее наоборот, если в программе не должно создаваться пустых объектов, отсутствие конструктора без аргументов может указать при компиляции на уязвимые места в которых неявно вызывается конструктор не того, что нам нужно.
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
21.04.2012, 04:05 18
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Вот кстати, не надо про то что он ОБЯЗАТЕЛЕН.
Скорее наоборот, если в программе не должно создаваться пустых объектов, отсутствие конструктора без аргументов может указать при компиляции на уязвимые места в которых неявно вызывается конструктор не того, что нам нужно.
Дык и операция присваивания, и конструктор копирования тоже можно закрыть. Если не требуется создавать копии объектов.
Я в книжке такое для стеков применял: зачем стеки копировать?
А стек весь из себя динамический.

Но про обязательность не я первый написал.
Более авторитетный товарищ Джеймс Коплиен в своей книжке Advanced C++ успел раньше...
0
21.04.2012, 04:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2012, 04:05
Помогаю со студенческими работами здесь

Вызов деструктора
Есть написанный мною код: #include &lt;iostream&gt; class Foo { private: int *key; public: Foo...

Вызов деструктора
Вызывается ли деструктор объекта при завершении программы? а при аварийном завершении? А если снять...

Использование деструктора
Я не очень понимаю в каких случаях в классе или шаблоне надо реализовавывать дестрактор а в каких...

Вызов деструктора
Здравствуйте ,подскажите пожалуйста ,есть вот такой код ... При создании объекта MyClass в...

Отключение деструктора
Вопрос такой. Возможно ли каким-то образом предотвратить вызов деструктора при уничтожении объекта?...

Описание деструктора
Пример: #include&lt;iostream&gt; using namespace std; class A { int A; };


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru