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

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

Войти
Регистрация
Восстановить пароль
 
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 432
#1

Ошибка в конструкторе копирования класса - C++

20.04.2013, 07:25. Просмотров 418. Ответов 8
Метки нет (Все метки)

Хотя и делал по образцу, но почему то лезет ошибка записи за пределы динамического массива, хотя и переменные копируются верно (отладчик вижлы подтвердил). конструктор наследованного класса даже не ковырял, т.к. ошибка таже
мэин
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include "cd.h"
void Bravo (const Cd & disk);
int main () {
    Cd c1 ("Beatles", "Capitol", 14, 35.5);
    Classic c2 = Classic ("Piano sonata in B flat, Fantasia in C", "Alfred Brendel", "Phillips", 2, 57.17);
    Cd *pcd = &c1;
    using std::cout;
    Cd ad;
    ad = c1;
    cout << "Using object directly:\n";
    c1.Report ();
    cout << '\n';
    c2.Report ();
    cout << "\nUsing type cd * pointer to objects:\n";
    pcd->Report ();
    pcd = &c2;
    pcd->Report ();
    cout << "\nCalling a function with a Cd reference argument:\n";
    Bravo (c1);
    Bravo (c2);
    cout << "\nTesting assignment: ";
    Classic copy;
    copy = c2;
    copy.Report ();
    std::cin.get ();
    return 0;
};
void Bravo (const Cd & disk) {
    disk.Report ();
};

хэдэр
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 class Cd {
 private:
     char * performers;
     char * label;
     int length;
     int selections;
     double playtime;
 public:
     Cd (char * s1, char * s2, int n, double x);
     Cd (const Cd & d);
     Cd ();
     virtual ~Cd ();
     virtual void Report () const;
     Cd & operator = (const Cd  & d);
 };
 class Classic : public Cd {
 private:
     char * important;
 public:
     Classic ();
     Classic (char * im, char * s1, char * s2, int n, double x);
     Classic (char * im, Cd & temp);
     Classic (const Classic & temp);
     virtual void Report () const;
     Classic & operator = (const Classic & temp);
     virtual ~Classic ();
 };

методы
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "cd.h"
#include <iostream>
#include <cstring>
Cd::Cd () {
    performers = new char [8];
    strcpy (performers, "perfomer");
    label = new char [4];
    strcpy (label, "song");
    selections = 0;
    playtime = 0;
};
Cd::Cd (char  * s1, char * s2, int n, double x) {
    performers = new char [strlen (s1) + 1];
    strcpy (performers, s1);
    label = new char [strlen (s2) + 1];
    strcpy (label, s2);
    selections = n;
    playtime = x;
};
Cd::Cd (const Cd & d) {
    performers = new char [strlen (d.performers) + 1];
    strcpy (performers, d.performers);
    label = new char [strlen (d.label) + 1];
    strcpy (label, d.label);
    selections = d.selections;
    playtime = d.playtime;
};
void Cd::Report () const {
    using std::cout;
    cout << *performers << ", " << *label << ", " << selections << ", " << playtime;
};
Cd::~Cd () {
    delete [] performers;
    delete [] label;
};
Cd & Cd::operator= (const Cd & d) {
    if (this == &d) return *this;
    delete [] performers;
    delete [] label;
    length = strlen (d.performers);
    performers = new char [length + 1];
    strcpy (performers, d.performers);
    length = strlen (d.label);
    label = new char [length + 1];
    strcpy (label, d.label);
    selections = d.selections;
    playtime = d.playtime;
    return *this;
};
Classic::Classic () : Cd () {
    important = new char [14];
    strcpy (important, "Important song");
};
Classic::Classic (char * im, char * s1, char * s2, int n, double x) : Cd (s1, s2, n, x) {
    important = new char [strlen (im) + 1];
    strcpy (important, im);
};
Classic::Classic (char * im, Cd & temp) : Cd (temp) {
    important = new char [strlen (im) + 1];
    strcpy (important, im);
};
Classic::Classic (const Classic & temp) : Cd (temp) {
    important = new char [strlen (temp.important) + 1];
    strcpy (important, temp.important);
};
Classic & Classic::operator = (const Classic & temp) {
    if (this == &temp) return *this;
    delete [] important;
    Cd::operator= (temp);
    important = new char [strlen (temp.important) + 1];
    strcpy (important, temp.important);
    return *this;
};
Classic::~Classic () {
    delete [] important;
};
void Classic::Report () const {
    Cd::Report ();
    std::cout << ", " << important;
};

другая версия с той же ошибкой
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Cd & Cd::operator= (const Cd & d) {
    if (this == &d) return *this;
    delete [] performers;
    delete [] label;
    length = strlen (d.performers);
    performers = new char [length];
    strncpy (performers, d.performers,length);
    performers [length] = '\0';
    length = strlen (d.label);
    label = new char [length];
    strncpy (label, d.label, length);
    label [length] = '\0';
    selections = d.selections;
    playtime = d.playtime;
    return *this;
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2013, 07:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка в конструкторе копирования класса (C++):

Исправить ошибку в конструкторе копирования пользовательского класса Sort - C++
Здравствуйте. Такая вот проблема. Обычный конструктор работает без ошибок и подчеркиваний: Sort::Sort() { cout &lt;&lt; &quot;len = &quot;; ...

Ошибка в конструкторе копирования C++ - C++
Помогите, пожалуйста создать конструктор копирования, который будет копировать элемент и добавлять его в список. У меня получился такой...

Ошибка в конструкторе копирования - C++
Здравствуйте. Есть один класс для работы с многочленами, который хранит элементы многочлена в списке. Так вот, в конструкторе копирования...

Ошибка при работе с объектом класса в конструкторе другого класса - C++
Имеется данный код: https://github.com/ubelian/glgame/tree/master/glgame В файле Food.cpp в конструкторе класса Food::Food() на 19...

В конструкторе копирования отцовского (_str) класса возникает некое "необработанное исключение" - C++
Добрый день. Делаю курсовик в универе, иерархия классов и работа с ними. В конструкторе копирования отцовского (_str) класса возникает...

Ошибка в конструкторе класса - C++
Всем доброго времени суток! Есть простая задачка: Написать реализацию класса и короткую программку, использующую все функции-члены. ...

8
Croessmah
Эксперт CЭксперт С++
13416 / 7570 / 855
Регистрация: 27.09.2012
Сообщений: 18,639
Записей в блоге: 3
Завершенные тесты: 1
20.04.2013, 08:24 #2
В операторе присваивания нет проверки указателей перед delete[] и выход за пределы массива.
1
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 432
20.04.2013, 09:52  [ТС] #3
Цитата Сообщение от Croessmah Посмотреть сообщение
В операторе присваивания нет проверки указателей перед delete[] и выход за пределы массива.
Как их проверять и где конкретно выход?
0
Croessmah
Эксперт CЭксперт С++
13416 / 7570 / 855
Регистрация: 27.09.2012
Сообщений: 18,639
Записей в блоге: 3
Завершенные тесты: 1
20.04.2013, 09:57 #4
При записи нуля в perfomers[length] у Вас выделяется length элементов, индексация с нуля, поэтому последний индекс будет length-1
0
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 432
20.04.2013, 10:01  [ТС] #5
Цитата Сообщение от Croessmah Посмотреть сообщение
При записи нуля в perfomers[length] у Вас выделяется length элементов, индексация с нуля, поэтому последний индекс будет length-1
Даже если выделять length + 1 элементов ничего не меняется
0
Croessmah
Эксперт CЭксперт С++
13416 / 7570 / 855
Регистрация: 27.09.2012
Сообщений: 18,639
Записей в блоге: 3
Завершенные тесты: 1
20.04.2013, 10:08 #6
С label ситуация та же.
0
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 432
20.04.2013, 10:20  [ТС] #7
Цитата Сообщение от Croessmah Посмотреть сообщение
С label ситуация та же.
да хоть + 100 писать и там и там, ничего не изменится (проверено)
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.04.2013, 11:57 #8
Если так изменить, то работает без ошибок:
C++
1
2
3
4
5
6
7
8
9
Cd::Cd () 
{
    performers = new char [9];
    strcpy (performers, "perfomer");
    label = new char [5];
    strcpy (label, "song");
    selections = 0;
    playtime = 0;
}
C++
1
2
3
4
5
Classic::Classic () : Cd () 
{
    important = new char [15];
    strcpy (important, "Important song");
};
0
Миниатюры
Ошибка в конструкторе копирования класса  
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 432
20.04.2013, 12:45  [ТС] #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Если так изменить, то работает без ошибок:
Спасибо огромное, теперь будет наглядный пример переполнения памяти. С толку сбило то, что объекты создаются нормально и если поставить точку останова до присваивания то всё спокойно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2013, 12:45
Привет! Вот еще темы с ответами:

Ошибка в объявлении класса (в конструкторе) - C++
Я не могу разобраться с классами и конструкторами, в строчке Progect();// {numb=0; sum=0; date=;} всегда высвечивает ошибку,...

Ошибка в конструкторе класса динамических строк - C++
Необходимо создать класс динамических строк с конструктором копирования, оператором присваивания, операторами сравнения, операторами...

О конструкторе копирования - C++
Доброго времени суток всем присутствующим. Интересует маленький вопрос. В 15-й строке происходит прямое обращение к полю входного объекта...

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


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

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

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