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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
vano468
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 7
#1

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

18.09.2011, 19:32. Просмотров 922. Ответов 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;
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2011, 19:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблема перегрузки и деструктора (C++):

Вызов деструктора - C++
Вызывается ли деструктор объекта при завершении программы? а при аварийном завершении? А если снять процесс приложения диспетчером?

Вызов деструктора - C++
Есть написанный мною код: #include &lt;iostream&gt; class Foo { private: int *key; public: Foo (const int a=0) { key = new int...

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

Вызов деструктора - C++
Доброго вам времени суток. Проблема в том, что деструктор не выводит сообщение без этой строки. s1.~Shave(); И я не уверен, что так...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
sandye51
программист С++
684 / 586 / 39
Регистрация: 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
программист С++
684 / 586 / 39
Регистрация: 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
программист С++
684 / 586 / 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;
      явно не то, что нужно*/
   }
}
1
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 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
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
19.09.2011, 01:22 #9
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
1. конструктор без аргументов
С 2,3,4 понятно, а 1 почему?
0
sandye51
программист С++
684 / 586 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
19.09.2011, 01:25 #10
потому что указатель надо инициализировать NULL'ом
1
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 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
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
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
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.04.2012, 12:34 #15
Цитата Сообщение от vano468 Посмотреть сообщение
http://pastebin.com/DSx0CJep
Ссылка нерабочая. Выложите код на форум (в виде текста).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2012, 12:34
Привет! Вот еще темы с ответами:

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

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

Ошибка деструктора - C++
Имеется шаблон класса- динамического массива. После создания функции push_back начал ругаться конструктор. Объясните пожалуйста в чем дело?...

Не врубаюсь в работу деструктора - C++
Всем доброго времени суток. Не понимаю работу деструктора. Деструктор вроде как должен освобождать память от того что осталось после...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.04.2012, 12:34
Ответ Создать тему
Опции темы

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