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

Ошибка при вызове деструктора - C++

Восстановить пароль Регистрация
 
Mr_Sorry
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
26.09.2016, 10:07     Ошибка при вызове деструктора #1
Подскажите, что не так с этим деструктором? Просто выдает ошибку. Если его убираю то все идет норм. Если же оставляю, то куча всяких ошибок. Как образец оставил минимум от кода. И то не работает.

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
#include <iostream>
#include <cstdlib>
#include <conio.h>
 
const int ERR_EXIT = -1;
 
using namespace std;
 
class Vector
{
 
    double **vec;
    int
        rows,  // число строк
        colls; // число столбцов
 
public:
    Vector();// конструктор без параметров
    ~Vector();
    void printVector(); //печать вектора
 
};
 
Vector::Vector()
{
    int i, j;
 
    colls = 1;
    rows = 1;
 
    if (!(vec = new double*[rows]))
    {
        cerr << "Невозможно разместить вектор в памяти";
        exit(ERR_EXIT);
    }
    for (i = 0; i < rows; i++)
        if (!(vec[i] = new double[colls]))
        {
            cerr << "Невозможно разместить вектор в памяти";
            exit(ERR_EXIT);
        }
 
    for (i = 0; i < rows; i++)
        for (j = 0; j < colls; j++)
            vec[i][j] = 0;
 
}
 
Vector::~Vector()
{
    unsigned int i;
 
    for (i = 0; i < rows; i++)
    {
        delete [] vec[i];
    }
    delete [] vec;
 
}
 
 
void Vector::printVector()
{
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < 1; j++)
        {
            cout << vec[i][j] << " ";
        }
        cout << endl;
    }
}
int main()
{
    setlocale(0, "");
 
    Vector A;
    A.printVector();
    A.~Vector();
 
    _getch();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,900
Записей в блоге: 2
Завершенные тесты: 1
26.09.2016, 10:12     Ошибка при вызове деструктора #2
Цитата Сообщение от Mr_Sorry Посмотреть сообщение
C++
1
A.~Vector();
А зачем Вы его явно вызываете здесь? Уберите.
Mr_Sorry
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
26.09.2016, 10:17  [ТС]     Ошибка при вызове деструктора #3
Да это я так поставил. Суть не в явном вызове, а в его неработоспособности как такового.
Invader0x7F
Helper C/C++
 Аватар для Invader0x7F
264 / 141 / 56
Регистрация: 22.09.2016
Сообщений: 478
Завершенные тесты: 4
26.09.2016, 10:19     Ошибка при вызове деструктора #4
Деструкторы не доступны через объект в том случае если объект класса объявлен статически:

C++
1
2
3
    Vector* pA = new Vector();
    A->printVector();
    delete pA; // Вызывает деструктор
Вот так...
nmcf
4303 / 3724 / 1255
Регистрация: 14.04.2014
Сообщений: 14,579
26.09.2016, 10:20     Ошибка при вызове деструктора #5
Цитата Сообщение от Mr_Sorry Посмотреть сообщение
Просто выдает ошибку.
Какую? Текст давай.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,900
Записей в блоге: 2
Завершенные тесты: 1
26.09.2016, 10:21     Ошибка при вызове деструктора #6
Цитата Сообщение от Mr_Sorry Посмотреть сообщение
Суть не в явном вызове
Именно в нем суть. Деструктор будет вызван при уничтожении объекта.
Так что Вы получите два вызова деструктора.

К тому же
C++
1
2
3
4
5
6
7
8
9
10
11
    if (!(vec = new double*[rows]))
    {
        cerr << "Невозможно разместить вектор в памяти";
        exit(ERR_EXIT);
    }
//...
        if (!(vec[i] = new double[colls]))
        {
            cerr << "Невозможно разместить вектор в памяти";
            exit(ERR_EXIT);
        }
условия эти абсолютно бесполезные,
т.к. new кинет исключение в случае ошибки, а не вернет ноль.
Да и не факт что new вообще будет знать о том, что памяти нет
и программа упадет при обращении непосредственно к памяти.
Mr_Sorry
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
26.09.2016, 10:25  [ТС]     Ошибка при вызове деструктора #7
Вот ошибка.
Миниатюры
Ошибка при вызове деструктора  
Mr_Sorry
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
26.09.2016, 10:26  [ТС]     Ошибка при вызове деструктора #8
Цитата Сообщение от Croessmah Посмотреть сообщение
условия эти абсолютно бесполезные,
Я это понимаю, но задание велит этот кусок кода использовать.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,900
Записей в блоге: 2
Завершенные тесты: 1
26.09.2016, 10:27     Ошибка при вызове деструктора #9
Цитата Сообщение от Mr_Sorry Посмотреть сообщение
Я это понимаю, но задание велит этот кусок кода использовать.
Что это за задание такое?
"Написать код содержащий ошибку"?
Mr_Sorry
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
26.09.2016, 10:31  [ТС]     Ошибка при вызове деструктора #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Что это за задание такое?
"Написать код содержащий ошибку"?
@В переменную состояния устанавливать код ошибки,
когда не хватает памяти, выходит за пределы массива.@

И дан этот кусок для примера.
nmcf
4303 / 3724 / 1255
Регистрация: 14.04.2014
Сообщений: 14,579
26.09.2016, 10:43     Ошибка при вызове деструктора #11
Исключения используй, если нужно это контролировать.
Mr_Sorry
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
26.09.2016, 10:47  [ТС]     Ошибка при вызове деструктора #12
Нашел вот такую проблему. Деструктор выдает ошибку из-за оператора присваивания. Если деструктор закоментировать, то оператор выдает ошибку в строке 8. Может ошибка в операторе?

C++
1
2
3
4
5
6
7
8
9
10
11
Vector Vector::operator = (const Vector &B)
{
    unsigned int i, j;
    
 
    for (j = 0; j < B.rows; j++)
        for (i = 0; i < B.colls; i++)
            vec[i][j] = B.vec[i][j];
 
    return *this;
}
C++
1
2
3
4
5
6
7
8
9
10
11
Vector::~Vector()
{
    unsigned int i;
 
    for (i = 0; i < rows; i++)
    {
        delete [] vec[i];
    }
    delete [] vec;
 
}
Invader0x7F
Helper C/C++
 Аватар для Invader0x7F
264 / 141 / 56
Регистрация: 22.09.2016
Сообщений: 478
Завершенные тесты: 4
26.09.2016, 10:51     Ошибка при вызове деструктора #13
На самом деле деструктор вызывать через объект напрямую нельзя. Лучше воспользуйтесь динамической инициализацией объекта:

C++
1
2
3
    Vector* pA = new Vector();
    pA->printVector();
    delete pA; // Вызывает деструктор
И тогда ошибка не возникает.
nmcf
4303 / 3724 / 1255
Регистрация: 14.04.2014
Сообщений: 14,579
26.09.2016, 10:54     Ошибка при вызове деструктора #14
Invader0x7F, успокойся, там не в этом проблема.

Всё надо показывать, а не фрагменты, в которых нет ошибок.
Конструктор копирования и оператор присваивания определены в классе?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,900
Записей в блоге: 2
Завершенные тесты: 1
26.09.2016, 10:55     Ошибка при вызове деструктора #15
Цитата Сообщение от Mr_Sorry Посмотреть сообщение
Нашел вот такую проблему.
В первом коде этого вообще нет.
Mr_Sorry
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
26.09.2016, 11:00  [ТС]     Ошибка при вызове деструктора #16
Цитата Сообщение от nmcf Посмотреть сообщение
Конструктор копирования и оператор присваивания определены в классе?
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
class Vector
{
 
    double **vec;
    int
        rows,  // число строк
        colls; // число столбцов
 
public:
    Vector();// конструктор без параметров
    ~Vector();// деструктор
    Vector(int _rows);// конструктор с одним параметром
    Vector(int _rows, int _colls);// конструктор с двумя параметрами
    Vector(Vector const &A);
 
    Vector operator * (Vector &B);
    Vector operator = (Vector  &B);
 
 
 
    void printVector(); //печать матрицы
 
};
 
Vector::Vector()
{
    int i, j;
 
    colls = 1;
    rows = 1;
 
    if (!(vec = new double*[rows]))
    {
        cerr << "Невозможно разместить вектор в памяти";
        exit(ERR_EXIT);
    }
    for (i = 0; i < rows; i++)
        if (!(vec[i] = new double[colls]))
        {
            cerr << "Невозможно разместить вектор в памяти";
            exit(ERR_EXIT);
        }
 
    for (i = 0; i < rows; i++)
        for (j = 0; j < colls; j++)
            vec[i][j] = 0;
 
}
Vector::~Vector()
{
    unsigned int i;
    cout << "Сработал деструктор";
 
    for (i = 0; i < rows; i++)
    {
        delete [] vec[i];
    }
    delete [] vec;
 
}
Vector::Vector(int _rows)
{
    rows = _rows;
    colls = 1;
    vec = new double*[_rows];
    for (int i = 0; i < rows; i++)
    {
        vec[i] = new double[_rows];
    }
 
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < colls; j++)
            vec[i][j] = i + 1;
    }
 
}
Vector::Vector(int _rows, int _colls)
{
    rows = _rows;
    colls = 1;
 
    vec = new double*[_rows];
    for (int i = 0; i < rows; i++)
    {
        vec[i] = new double[_rows];
    }
 
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < 1; j++)
            vec[i][j] = _colls;
    }
}
Vector::Vector(Vector const &B)
{
    unsigned int i, j;
 
    for (i = 0; i < B.rows; i++)
        for (j = 0; j < B.colls; i++)
            vec[i][j] = B.vec[i][j];
}
Vector Vector::operator * (Vector &B)
{
    int i, j;
 
    Vector M(B.rows, 0);
 
 
    for (i = 0; i < B.rows; i++)
        for (j = 0; j < 1; j++)
            M.vec[i][j] = vec[i][j] * B.vec[i][j];
    return M;
}
 
Vector Vector::operator = (Vector &B)
{
    unsigned int i, j;
    
    for (i = 0; i < B.rows; i++)
        for (j = 0; j < B.colls; j++)
            vec[i][j] = B.vec[i][j];
 
    return *this;
}
 
void Vector::printVector()
{
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < 1; j++)
        {
            cout << vec[i][j] << " ";
        }
        cout << endl;
    }
}
int main()
{
    setlocale(0, "");
 
        Vector A, B(4), C(4,5), D(4,0);
        A.printVector();
        cout << endl;
        B.printVector();
        cout << endl;
        C.printVector();
        D = (B * C);
        cout << endl;
        D.printVector();
 
 
 
    _getch();
}
nmcf
4303 / 3724 / 1255
Регистрация: 14.04.2014
Сообщений: 14,579
26.09.2016, 11:05     Ошибка при вызове деструктора #17
В конструкторе копирования почему память не выделяется как в других?
Оператор присваивания должен ссылку возвращать.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,900
Записей в блоге: 2
Завершенные тесты: 1
26.09.2016, 11:06     Ошибка при вызове деструктора #18
C++
1
2
3
4
5
6
7
8
Vector::Vector(Vector const &B)
{
    unsigned int i, j;
 
    for (i = 0; i < B.rows; i++)
        for (j = 0; j < B.colls; i++)
            vec[i][j] = B.vec[i][j];//<-- а память кто выделять будет?
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.09.2016, 11:10     Ошибка при вызове деструктора
Еще ссылки по теме:

C++ Ошибка при вызове деструктора
C++ При вызове деструктора вылазит ошибка _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
C++ При вызове деструктора выдается ошибка _BLOCK_TYPE_IS_VALID (pHead->nBlockUse)

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

Или воспользуйтесь поиском по форуму:
Mr_Sorry
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
26.09.2016, 11:10  [ТС]     Ошибка при вызове деструктора #19
Цитата Сообщение от Croessmah Посмотреть сообщение
а память кто выделять будет?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Vector::Vector(Vector const &B)
{
    unsigned int i, j;
 
    vec = new double*[B.rows];
    for (int i = 0; i < B.rows; i++)
    {
        vec[i] = new double[B.rows];
    }
 
    for (i = 0; i < B.rows; i++)
        for (j = 0; j < 1; i++)
            vec[i][j] = B.vec[i][j];
}
Выделил?
Yandex
Объявления
26.09.2016, 11:10     Ошибка при вызове деструктора
Ответ Создать тему
Опции темы

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