Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
vano468
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
#1

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

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

Собственно хотел перегрузить оператор "<<" для пользовательского вывода.
Просто взял и скопировал кусок кода из написанной ранее функции вывода в функцию перегруза, все бы прекрасно, но при вызове деструктора программа крашится, без перегруза все работает отлично.
Программа крашится в выдается ошибка: _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;
    }
}

http://www.cyberforum.ru/cpp-beginners/thread1595516.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2011, 19:32
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Проблема перегрузки и деструктора (C++):

Работа деструктора
Доброго дня, уважаемые программисты! Лаба. Есть класс Дата_и_Время, в классе...

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

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

Вызов деструктора
При ручном вызове деструктора, освобождается ли память*

Ошибка деструктора
Имеется шаблон класса- динамического массива. После создания функции push_back...

17
sandye51
программист С++
833 / 592 / 147
Регистрация: 19.12.2010
Сообщений: 2,016
18.09.2011, 19:49 #2
скорее всего неправильно конструктор копирования реализован
и объекты передавать лучше по константной ссылке
1
vano468
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
18.09.2011, 20:00  [ТС] #3
конструктор копирования?
Я вроде ничего такого не реализовывал.
0
sandye51
программист С++
833 / 592 / 147
Регистрация: 19.12.2010
Сообщений: 2,016
18.09.2011, 20:01 #4
вот и хреново, как видно по деструктору у вас в классе есть работа с динамической памятью, а значит надо реализовывать конструктор копирования
0
vano468
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
18.09.2011, 20:07  [ТС] #5
Собственно, я пока даже не знаю, что такое "конструктор копирования". С++ изучаю первый день.
Вы меня не просвятите ?
0
sandye51
программист С++
833 / 592 / 147
Регистрация: 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;
      явно не то, что нужно*/
   }
}
1
ValeryLaptev
Эксперт С++
1049 / 828 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
18.09.2011, 20:48 #7
vano468, при работе с динамической памятью обязательными для реализации являются:
1. конструктор без аргументов
2. Конструктор копирования
3. Деструктор
4. Операция присваивания.

Остальное добавить "по вкусу"...
2
vano468
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
18.09.2011, 23:47  [ТС] #8
Спасибо, нашел пример у Шилдта, буду реализовывать.
0
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
19.09.2011, 01:22 #9
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
1. конструктор без аргументов
С 2,3,4 понятно, а 1 почему?
0
sandye51
программист С++
833 / 592 / 147
Регистрация: 19.12.2010
Сообщений: 2,016
19.09.2011, 01:25 #10
потому что указатель надо инициализировать NULL'ом
1
ValeryLaptev
Эксперт С++
1049 / 828 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
19.09.2011, 09:48 #11
Цитата Сообщение от sandye51 Посмотреть сообщение
потому что указатель надо инициализировать NULL'ом
Это тоже. Но более важная причина: при объявлении массива объектов для создания каждого элемента вызывается конструктор по умолчанию.
1
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)
И все стало работать и с конструктором копирования и без него.
0
Chelioss
181 / 181 / 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
vano468
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
19.09.2011, 23:26  [ТС] #14
Да, я понимаю, что во втором случае конструктор копирования не нужен.
Все же, можете посмотреть мой код и попробовать найти ошибку, она либо в констр. копирования либо в деструкторе.
0
silent_1991
Эксперт С++
5007 / 3066 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
19.04.2012, 12:34 #15
Цитата Сообщение от vano468 Посмотреть сообщение
http://pastebin.com/DSx0CJep
Ссылка нерабочая. Выложите код на форум (в виде текста).
0
vano468
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
19.04.2012, 15:10  [ТС] #16
Не актуально.
0
Kuzia domovenok
2208 / 1977 / 440
Регистрация: 25.03.2012
Сообщений: 6,936
Записей в блоге: 1
19.04.2012, 15:58 #17
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
1. конструктор без аргументов
Вот кстати, не надо про то что он ОБЯЗАТЕЛЕН.
Скорее наоборот, если в программе не должно создаваться пустых объектов, отсутствие конструктора без аргументов может указать при компиляции на уязвимые места в которых неявно вызывается конструктор не того, что нам нужно.
0
ValeryLaptev
Эксперт С++
1049 / 828 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
21.04.2012, 04:05 #18
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Вот кстати, не надо про то что он ОБЯЗАТЕЛЕН.
Скорее наоборот, если в программе не должно создаваться пустых объектов, отсутствие конструктора без аргументов может указать при компиляции на уязвимые места в которых неявно вызывается конструктор не того, что нам нужно.
Дык и операция присваивания, и конструктор копирования тоже можно закрыть. Если не требуется создавать копии объектов.
Я в книжке такое для стеков применял: зачем стеки копировать?
А стек весь из себя динамический.

Но про обязательность не я первый написал.
Более авторитетный товарищ Джеймс Коплиен в своей книжке Advanced C++ успел раньше...
0
21.04.2012, 04:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2012, 04:05
Привет! Вот еще темы с решениями:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru