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

При вызове деструктора в строке delete[] data выбрасывается исключение

13.12.2019, 20:32. Показов 3582. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
вот как раз вопрос по этой теме. программа отрабатывает все команды и в конце при вызове деструктора в строке delete[] data выбрасывает исключение. Где искать? Что делать? maxsize делала и в классе и вне класса статической переменной, ничего не помогает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Set(int n) {
        cout << "вызвался конструктор Set с параметром" << endl;
        maxsize = n;
        data = new char[maxsize];//выделить динамическую память для массива элементов
        cursize = 0;
    }
    Set(const Set& ob) {
        cout << "вызвался конструктор копирования Set" << endl;       
        data = new char[maxsize];
        for (int i = 0; i < cursize; i++)
            data[i] = ob.data[i];
    }
    ~Set() {
        cout << "вызвался деструктор Set" << endl;
        delete[] data;
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2019, 20:32
Ответы с готовыми решениями:

Ошибка при вызове деструктора (при вызове delete в деструкторе)
Не могу найти ошибку, при вызове деструктора от класса, который был создан при помощи конструктора...

Выбрасывается исключение при вызове функций из библиотеки glut
Здраствуйте //почемуто возникает exeption тогда когда вызываются функции из библиотеки glut!!!...

Выбрасывается исключение при создании класса
Как объявить класс и поля с методами и функциями в нем?? Пытался сделать так но выводит исключение...

Выбрасывается исключение при попытке подключения к БД
При запуске кода выдает исключение, classpath настроил. Не знаю, что делать. В чем может быть...

15
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
13.12.2019, 21:07 2
Увидеть бы выражение, в котором выбрасывается исключение, а по этому обрывку можно сказать, что не хватает конструктора по умолчанию и оператора присваивания
0
Злостный нарушитель
9492 / 5139 / 1172
Регистрация: 12.03.2015
Сообщений: 24,221
13.12.2019, 21:08 3
покаж весь класс, не стесняйся.
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
13.12.2019, 21:08 4
Также в конструкторе копирования почему то не копируются maxsize и cursize
1
11 / 10 / 7
Регистрация: 07.05.2013
Сообщений: 248
13.12.2019, 21:18 5
я думаю тут cursize и maxsize поля класса
да и к тому же maxsize присваивается значение входного параметра n

Добавлено через 2 минуты
если я правильно помню, сначала надо очистить элементы (пройтись по всем и вызвать у каждого delete), а затем выполнить удаление непосредственно у переменной

ну т.е что-то вроде:
C++
1
2
3
4
5
6
for (int i = 0; i < maxsize; ++i)
{
delete data[i];
}
 
delete [] data;
0
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 68
14.12.2019, 16:05  [ТС] 6
весь код: делаю класс, конструктор копирования есть.

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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
static int maxsize = 0;
class Set {
private:
    char* data;    
    int   cursize;
public:
    Set() {
        cout << "вызвался конструктор Set" << endl;
    };
    Set(int n, char*D) {
        cout << "вызвался конструктор Set с параметром" << endl;
        maxsize = n;
        data = new char[maxsize];//выделить динамическую память для массива элементов
        data = new char[maxsize]; // под массив выделяется память - нужен деструктор для ее удаления
        for (int i(0); i < maxsize; i++)
        {
            data[i] = D[i];
        }
        cursize = 0;
    }
    Set(const Set& ob) {
        cout << "вызвался конструктор копирования Set" << endl;       
        data = new char[maxsize];
        for (int i = 0; i < cursize; i++)
            data[i] = ob.data[i];
    }
    ~Set() {
        cout << "вызвался деструктор Set" << endl;
        delete[] data;
    }
 
    // перегрузить оператор присваивания
    Set& operator =(Set& b) {
        // Выполнить копирование значений      
        cursize = b.cursize;
        data = b.data;
        // Возвратить текущий объект, чтобы иметь возможность связать в цепочку выполнение нескольких операций присваивания
        return *this;
 
    };
 
    //вставить по принципу дерева
    //(упорядоченная вставка при помощи двоичного поиска)
    Set& operator + (const char c) {
        if (cursize >= maxsize)
            return *this;
        else if (!cursize || (c > data[cursize - 1])) {
            data[cursize++] = c;
            return *this;
        }
        int m, f = 0, l = cursize;
        while (f < l) {
            m = f + (l - f) / 2;
            if (c == data[m])
                return *this;
            else if (c < data[m])
                l = m;
            else
                f = m + 1;
        }
 
        for (int i = cursize; i > f; --i)
            data[i] = data[i - 1];
 
        data[f] = c;
        ++cursize;
        return *this;
    }
 
    //
    Set& operator - (const char d) {
        unsigned int number, i, j;
        for (i = 0; i < cursize; i++)
        {
            if (d == data[i])
            {
                for (j = i; j < cursize - 1; j++)
                    data[j] = data[j + 1];
                cursize--;
            }
 
        }
        return *this;
 
    };
    // перегрузить оператор равенства
    bool operator == (const Set &c) {
        if (this->cursize != c.cursize)
        {
            cout << "размеры неравны!" << endl;
            return false;
        }
        cout << "размеры равны!" << endl;
 
        for (int i = 0; i < c.cursize; i++)
        {
            if (this->data[i] != c.data[i])
            {
                cout << "но значения не неравны!" << endl;
                return false;
            }
            else
                cout << "значения равны!" << endl;
 
        }
        return true;
    };
 
    // перегрузить оператор неравенства
    bool operator != (const Set &c) {
        if (this->cursize != c.cursize)
 
        {
            cout << "размеры неравны!" << endl;
            return true;
        }
        cout << "размеры равны!" << endl;
        for (int i = 0; i < c.cursize; i++)
        {
            if (this->data[i] != c.data[i])
            {
                cout << "значения  не равны!" << endl;
                return true;
            }
            else
                cout << "значения равны!" << endl;
        }
        return false;
    };
 
    // перегрузить оператор проверки на подмножество
    bool operator > (const Set &b) {
        if (b.cursize > this->cursize)
        {
            cout << "размеры некоректны для проверки условия!" << endl;
            return false;
        }
        //cout << "размеры сопоставимы!" << endl;
        for (int i = 0; i < b.cursize; i++) // идем по элементам b
        {
            bool notfound = true; // считаем пока , что b[i] нет
            for (int j = 0; j < this->cursize; j++) // сравниваем со всеми a[j] по очереди
            {
                if (b.data[i] == this->data[j]) // нашли
                {
                    cout << b.data[i] << " == " << this->data[j] << " этот элемент состоит в множестве!" << endl;
                    notfound = false;
                    break;
                }
            }
            if (notfound)
 
                //cout << "не является!" << endl;
                return false;
            // если не нашли возвращаем false
        }
        return true; // все найдены
    };
 
    //ввести элемент множества с клавиатуры
    Set& Input() {
        char c;
        cout << "введи новый символ в множество Дерево" << endl;
        cin >> c;
        if (cursize >= maxsize)
            return *this;
        else if (!cursize || (c > data[cursize - 1])) {
            data[cursize++] = c;
            return *this;
        }
 
        int m, f = 0, l = cursize;
        while (f < l) {
            m = f + (l - f) / 2;
            if (c == data[m])
                return *this;
            else if (c < data[m])
                l = m;
            else
                f = m + 1;
        }
 
        for (int i = cursize; i > f; --i)
            data[i] = data[i - 1];
 
        data[f] = c;
        ++cursize;
    };
 
    // удалить элемент множества
    void extract()
    {
        unsigned int number, n, i, j;
        n = cursize;
        std::cout << "Введите номер элемента от 0 до " << cursize - 1 << std::endl;
        std::cin >> number;
 
        if (number < 0 || number > cursize)
            std::cout << "Ошибка " << std::endl;
        else
        {
            for (i = 0; i < n; i++)
            {
                if (i == number)
                {
                    for (j = i; j < n - 1; j++)
                        data[j] = data[j + 1];
                    n--;
                }
 
            }
            cursize--;
        }
    };
 
    //вывести все элементы множества на экран
    void Print(void) {
        cout << "размер множества = " << cursize << " элементов" << endl;
        cout << "множество состоит из  " << endl;
        for (int i = 0; i < cursize; ++i)
            cout << data[i] << ' ';
        cout << endl;
    };
 
};
Добавлено через 4 минуты
а если пытаюсь удалять поэлементно - не дает, подчеркивает data красным

C++
1
2
3
4
5
6
for (int i = 0; i < maxsize; ++i)
{
delete data[i];
}
 
delete [] data;
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
14.12.2019, 17:18 7
NNNNNNNNN,
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
class Set {
private:
    static const int maxsize = 100; //<-- какую роль это играет в вашем коде я не понял, поэтому сделал так
    int cursize;
    char* data;
public:
 
    Set():cursize(0), data(nullptr)
    {
        cout << "вызвался конструктор Set" << endl;
    }
 
    Set(int n, char*D):cursize(n), data(new char[n])
    {
        cout << "вызвался конструктор Set с параметром" << endl;
        for (int i(0); i < cursize; i++)
        {
            data[i] = D[i];
        }
    }
 
    Set(const Set& ob):Set(ob.cursize, ob.data)
    {
        cout << "вызвался конструктор копирования Set" << endl;
    }
 
    ~Set() {
        cout << "вызвался деструктор Set" << endl;
        delete[] data;
    }
 
    // перегрузить оператор присваивания
    Set& operator =(const Set& b) {
        // Выполнить копирование значений
        if (this != &b)
        {
            delete[] data;
            cursize = b.cursize;
            data = new char[cursize];
            for (int i(0); i < cursize; i++)
            {
                data[i] = b.data[i];
            }
        }       
        // Возвратить текущий объект, чтобы иметь возможность связать в цепочку выполнение нескольких операций присваивания
        return *this;
    }
// ...
// в остальное не вникал
// ...
};
0
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 68
14.12.2019, 20:06  [ТС] 8
исключение на строчку data[i] = D[i];
Миниатюры
При вызове деструктора в строке delete[] data выбрасывается исключение  
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
14.12.2019, 20:13 9
Цитата Сообщение от NNNNNNNNN Посмотреть сообщение
исключение на строчку data[i] = D[i];
покажи 16 строку функции main

Добавлено через 5 минут
Хотя лучше всю функцию main(только выдели комментарием строку, которая в твоем проекте №16)
0
Вездепух
Эксперт CЭксперт С++
12761 / 6644 / 1788
Регистрация: 18.10.2014
Сообщений: 16,801
14.12.2019, 20:40 10
Лучший ответ Сообщение было отмечено Kuzia domovenok как решение

Решение

Цитата Сообщение от NNNNNNNNN Посмотреть сообщение
конструктор копирования есть.
Конструктор копирования есть, но в нем написана чушь. Оператор присваивания есть, но в нем написана чушь... Дальше можно не смотреть.

Вам уже показали пальцем на чушь в конструкторе копирования. Зачес вы снова приводите этот код?

Добавлено через 2 минуты
Цитата Сообщение от NNNNNNNNN Посмотреть сообщение
C++
1
2
3
4
5
а если пытаюсь удалять поэлементно - не дает, подчеркивает data красным
for (int i = 0; i < maxsize; ++i)
{
delete data[i];
}
Что такое "удалять поэлементно"?
0
zayats80888
14.12.2019, 20:47
  #11

Не по теме:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что такое "удалять поэлементно"?
скорее всего это попытка последовать совету из непонятно к чему относящемуся поста №5

0
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 68
14.12.2019, 21:33  [ТС] 12
вот весь main
работает, пока закоментировано //delete[] data; в деструкторе
(при php.h которое в начале этой темы)

int Max_size = 20;//

int main() {
setlocale(LC_ALL, "ru");
std::cout << "Hello World!\n";
char *d=nullptr;

Set a = Set(Max_size, d);
a = a + 'm' + 'p' + 'a' + 'd' + 'e' + 'x' + 'w';
a = a - 'M';
a = a - 'k';
a.Print();

Set b = Set(Max_size, d);
b = b + 'a' + 't' + 'e' + 'm' + 'i';
b.Print();

Set c = Set(Max_size, d);
c = c + 'm' + 'p' + 'a' + 'd' + 'e' + 'x' + 'w' + 'r';
c.Print();
c.extract();
c.Print();

if (a == b) cout << "yes, a = b" << endl;
else cout << "a != b" << endl;
if (a == c) cout << "yes, a = c" << endl;
else cout << "a != c" << endl;

if (a != b) cout << "yes, a != b" << endl;
else cout << "a == b" << endl;
if (a != c) cout << "yes, a != c" << endl;
else cout << "a == c" << endl;

Set Q = Set(Max_size, d);
Set q2 = Set(Max_size, d);
Q = Q + 'A' + 'B' + 'O' + 'R' + 'A' + 'B' + 'W' + 'I';
Q.Print();

Set q = Set(Max_size, d);
q = q + 'O' + 'A' + 'R' + 'I' + 'W';
q.Print();
q2 = Q;
q2.Print();

if (Q > q)
cout << "подмножество q принадлежит Q" << endl;
else
cout << "НЕТ! подмножество q не принадлежит Q" << endl;
Q.extract();
Q.Print();
if (Q > q) cout << "подмножество q принадлежит Q " << endl;//вызвать оператор проверки на подмножество
else cout << "НЕТ! подмножество q не принадлежит Q" << endl;
Q.extract();

Q.Print();
q.Print();

if (Q > q) cout << "подмножество q принадлежит Q " << endl;//вызвать оператор проверки на подмножество
else cout << "НЕТ! подмножество q не принадлежит Q!" << endl;
return 0;

}

Добавлено через 2 минуты

да, "это попытка последовать совету из поста №5"
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
14.12.2019, 21:44 13
Цитата Сообщение от NNNNNNNNN Посмотреть сообщение
Set a = Set(Max_size, d);
ну ясен пень, в чем смысл такого вызова?
Set a;



Цитата Сообщение от NNNNNNNNN Посмотреть сообщение
char *d=nullptr;
удалить

Добавлено через 6 минут
Смысл maxsize я понял, только зачем тут динамический массив? Можно статическим обойтись
0
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 68
14.12.2019, 21:51  [ТС] 14
а конструктор? туда что вставлять вместо char *D?
C++
1
2
3
4
5
6
7
8
 Set(int n, char*D):cursize(n), data(new char[n])
    {
        cout << "вызвался конструктор Set с параметром" << endl;
        for (int i(0); i < cursize; i++)
        {
            data[i] = D[i];
        }
    }
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
14.12.2019, 21:53 15
Лучший ответ Сообщение было отмечено NNNNNNNNN как решение

Решение

исправил конструкторы под вашу задачу
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
class Set {
private:
    static const int maxsize = 20;
    int cursize;
    char* data;
public:
 
    Set() :cursize(0), data(new char[maxsize])
    {
        cout << "вызвался конструктор Set" << endl;
    }
 
    Set(int n, char* D) :cursize(n), data(new char[maxsize])
    {
        cout << "вызвался конструктор Set с параметром" << endl;
        for (int i(0); i < cursize; i++)
        {
            data[i] = D[i];
        }
    }
 
    Set(const Set& ob) :Set(ob.cursize, ob.data)
    {
        cout << "вызвался конструктор копирования Set" << endl;
    }
 
    ~Set() {
        cout << "вызвался деструктор Set" << endl;
        delete[] data;
    }
 
    // перегрузить оператор присваивания
    Set& operator =(const Set& b) {
        // Выполнить копирование значений
        if (this != &b)
        {
            cursize = b.cursize;
            for (int i(0); i < cursize; i++)
            {
                data[i] = b.data[i];
            }
        }
        // Возвратить текущий объект, чтобы иметь возможность связать в цепочку выполнение нескольких операций присваивания
        return *this;
    }
    // ...
    // в остальное не вникал
    // ...
и функцию main()
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
int main() {
    setlocale(LC_ALL, "ru");
    std::cout << "Hello World!\n";
 
    Set a;
    a = a + 'm' + 'p' + 'a' + 'd' + 'e' + 'x' + 'w';
    a = a - 'M';
    a = a - 'k';
    a.Print();
 
    Set b;
    b = b + 'a' + 't' + 'e' + 'm' + 'i';
    b.Print();
 
    Set c;
    c = c + 'm' + 'p' + 'a' + 'd' + 'e' + 'x' + 'w' + 'r';
    c.Print();
    c.extract();
    c.Print();
 
    if (a == b) cout << "yes, a = b" << endl;
    else cout << "a != b" << endl;
    if (a == c) cout << "yes, a = c" << endl;
    else cout << "a != c" << endl;
 
    if (a != b) cout << "yes, a != b" << endl;
    else cout << "a == b" << endl;
    if (a != c) cout << "yes, a != c" << endl;
    else cout << "a == c" << endl;
 
    Set Q;
    Set q2;
    Q = Q + 'A' + 'B' + 'O' + 'R' + 'A' + 'B' + 'W' + 'I';
    Q.Print();
 
    Set q;
    q = q + 'O' + 'A' + 'R' + 'I' + 'W';
    q.Print();
    q2 = Q;
    q2.Print();
 
    if (Q > q)
        cout << "подмножество q принадлежит Q" << endl;
    else
        cout << "НЕТ! подмножество q не принадлежит Q" << endl;
    Q.extract();
    Q.Print();
    if (Q > q) cout << "подмножество q принадлежит Q " << endl;//вызвать оператор проверки на подмножество
    else cout << "НЕТ! подмножество q не принадлежит Q" << endl;
    Q.extract();
 
    Q.Print();
    q.Print();
 
    if (Q > q) cout << "подмножество q принадлежит Q " << endl;//вызвать оператор проверки на подмножество
    else cout << "НЕТ! подмножество q не принадлежит Q!" << endl;
    return 0;
 
}
1
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 68
14.12.2019, 23:05  [ТС] 16
) смысл? задание - сделать массив динамическим. преподаватель так придумал.

Добавлено через 23 минуты
спасибо! теперь работает, пытаюсь понять где была проблема - можете намекнуть? если есть время, конечно. Но спасибо в любом случае!

Добавлено через 46 минут
стала искать определение двоеточия
оно имеет название? где про это прочитать?
это оно, нет? понять дико сложно, конечно...

Stack overflow-
"Область кода за двоеточием и до начала тела конструктора называется инициализатором конструктора.

Используется как для инициализации членов класса, так и для вызова конструктора базового/базовых классов, т.е. по сути, инициализации базовой составляющей. Также здесь может быть вызов другого конструктора текущего класса (делегирование конструкторов, начиная с c++11)."
0
14.12.2019, 23:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.12.2019, 23:05
Помогаю со студенческими работами здесь

Выбрасывается исключение при выводе элементов массива
В строке пишется последовательность чисел через пробел. Программа считает кол-во чисел и выводит...

Выбрасывается исключение при вводе названия фирмы
Добрый день! В моей программе неправильно работает ввод названия фирмы, и я не совсем понимаю,как...

Исключение повторно выбрасывается при завершении события DragDrop
Здравствуйте! Никак не могу решить одну проблему. Перетаскиваю файлы в pictureBox1 с рабочего...

Ошибка при вызове деструктора
Не могу дописать лабу... Надо создать 4 класса, описать поля и методы. Выкладываю исходники: Самый...


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

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