Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
vano468
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
18.09.2011, 19:32     Проблема перегрузки и деструктора #1
Собственно хотел перегрузить оператор "<<" для пользовательского вывода.
Просто взял и скопировал кусок кода из написанной ранее функции вывода в функцию перегруза, все бы прекрасно, но при вызове деструктора программа крашится, без перегруза все работает отлично.
Программа крашится в выдается ошибка: _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;
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2011, 19:32     Проблема перегрузки и деструктора
Посмотрите здесь:

Вызов деструктора C++
Использование деструктора C++
C++ Не понятный вызов деструктора
C++ Вызов деструктора
Вызов деструктора C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
18.09.2011, 19:49     Проблема перегрузки и деструктора #2
скорее всего неправильно конструктор копирования реализован
и объекты передавать лучше по константной ссылке
vano468
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
18.09.2011, 20:00  [ТС]     Проблема перегрузки и деструктора #3
конструктор копирования?
Я вроде ничего такого не реализовывал.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
18.09.2011, 20:01     Проблема перегрузки и деструктора #4
вот и хреново, как видно по деструктору у вас в классе есть работа с динамической памятью, а значит надо реализовывать конструктор копирования
vano468
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
18.09.2011, 20:07  [ТС]     Проблема перегрузки и деструктора #5
Собственно, я пока даже не знаю, что такое "конструктор копирования". С++ изучаю первый день.
Вы меня не просвятите ?
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
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;
      явно не то, что нужно*/
   }
}
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
18.09.2011, 20:48     Проблема перегрузки и деструктора #7
vano468, при работе с динамической памятью обязательными для реализации являются:
1. конструктор без аргументов
2. Конструктор копирования
3. Деструктор
4. Операция присваивания.

Остальное добавить "по вкусу"...
vano468
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
18.09.2011, 23:47  [ТС]     Проблема перегрузки и деструктора #8
Спасибо, нашел пример у Шилдта, буду реализовывать.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
19.09.2011, 01:22     Проблема перегрузки и деструктора #9
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
1. конструктор без аргументов
С 2,3,4 понятно, а 1 почему?
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
19.09.2011, 01:25     Проблема перегрузки и деструктора #10
потому что указатель надо инициализировать NULL'ом
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
19.09.2011, 09:48     Проблема перегрузки и деструктора #11
Цитата Сообщение от sandye51 Посмотреть сообщение
потому что указатель надо инициализировать NULL'ом
Это тоже. Но более важная причина: при объявлении массива объектов для создания каждого элемента вызывается конструктор по умолчанию.
vano468
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)
И все стало работать и с конструктором копирования и без него.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
19.09.2011, 23:20     Проблема перегрузки и деструктора #13
Что-то у вас не так. С конструктором копирования должен был работать вариант:
C++
1
ostream &operator << (ostream &stream, FreeInt obj)
А этому варианту вообще не нужен конструктор копирования:
C++
1
ostream &operator << (ostream &stream, FreeInt &obj)
vano468
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
19.09.2011, 23:26  [ТС]     Проблема перегрузки и деструктора #14
Да, я понимаю, что во втором случае конструктор копирования не нужен.
Все же, можете посмотреть мой код и попробовать найти ошибку, она либо в констр. копирования либо в деструкторе.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
19.04.2012, 12:34     Проблема перегрузки и деструктора #15
Цитата Сообщение от vano468 Посмотреть сообщение
http://pastebin.com/DSx0CJep
Ссылка нерабочая. Выложите код на форум (в виде текста).
vano468
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
19.04.2012, 15:10  [ТС]     Проблема перегрузки и деструктора #16
Не актуально.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
19.04.2012, 15:58     Проблема перегрузки и деструктора #17
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
1. конструктор без аргументов
Вот кстати, не надо про то что он ОБЯЗАТЕЛЕН.
Скорее наоборот, если в программе не должно создаваться пустых объектов, отсутствие конструктора без аргументов может указать при компиляции на уязвимые места в которых неявно вызывается конструктор не того, что нам нужно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2012, 04:05     Проблема перегрузки и деструктора
Еще ссылки по теме:

C++ Ошибка работы деструктора
C++ Ошибка деструктора
Отключение деструктора C++

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

Или воспользуйтесь поиском по форуму:
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
21.04.2012, 04:05     Проблема перегрузки и деструктора #18
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Вот кстати, не надо про то что он ОБЯЗАТЕЛЕН.
Скорее наоборот, если в программе не должно создаваться пустых объектов, отсутствие конструктора без аргументов может указать при компиляции на уязвимые места в которых неявно вызывается конструктор не того, что нам нужно.
Дык и операция присваивания, и конструктор копирования тоже можно закрыть. Если не требуется создавать копии объектов.
Я в книжке такое для стеков применял: зачем стеки копировать?
А стек весь из себя динамический.

Но про обязательность не я первый написал.
Более авторитетный товарищ Джеймс Коплиен в своей книжке Advanced C++ успел раньше...
Yandex
Объявления
21.04.2012, 04:05     Проблема перегрузки и деструктора
Ответ Создать тему
Опции темы

Текущее время: 14:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru