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

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

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

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

26.09.2016, 10:07. Просмотров 179. Ответов 18
Метки нет (Все метки)

Подскажите, что не так с этим деструктором? Просто выдает ошибку. Если его убираю то все идет норм. Если же оставляю, то куча всяких ошибок. Как образец оставил минимум от кода. И то не работает.

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();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2016, 10:07     Ошибка при вызове деструктора
Посмотрите здесь:

Ошибка при вызове деструктора - C++
По окончании программы выдает ошибку #include &lt;string.h&gt; #include &lt;iostream&gt; using namespace std; class nik //объявление...

Ошибка при вызове деструктора - C++
Программа компилиться нормально,но после выполнения system(&quot;pause&quot;); выползает непонятное окно,и указывает на ошибку в деструкторе.В чем...

Ошибка при вызове деструктора - C++
Добрый вечер! Почему при вызове деструктора вылетает ошибка после компиляции кода? #include &lt;conio.h&gt; #include &lt;iostream&gt; #include...

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

Ошибка при вызове деструктора - C++
Всем привет ! Есть класс class building { private: string *location_street; unsigned int *number_of_building; public...

При вызове деструктора вылазит ошибка _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) - C++
Понимаю,что подобный вопрос на форуме поднимался не раз,но разобраться не могу всё равно. Вот описание класса: class Stroka { ...

При вызове деструктора выдается ошибка _BLOCK_TYPE_IS_VALID (pHead->nBlockUse) - C++
Вопрос на форуме поднимался раз 100, но все равно не могу понять в чем проблема. Знаю, что искать нужно в setSpace() и getFlat(). Но что...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13051 / 7314 / 814
Регистрация: 27.09.2012
Сообщений: 18,050
Записей в блоге: 3
Завершенные тесты: 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++
281 / 158 / 61
Регистрация: 22.09.2016
Сообщений: 519
Завершенные тесты: 5
26.09.2016, 10:19     Ошибка при вызове деструктора #4
Деструкторы не доступны через объект в том случае если объект класса объявлен статически:

C++
1
2
3
    Vector* pA = new Vector();
    A->printVector();
    delete pA; // Вызывает деструктор
Вот так...
nmcf
5251 / 4571 / 1535
Регистрация: 14.04.2014
Сообщений: 18,170
26.09.2016, 10:20     Ошибка при вызове деструктора #5
Цитата Сообщение от Mr_Sorry Посмотреть сообщение
Просто выдает ошибку.
Какую? Текст давай.
Croessmah
Модератор
Эксперт CЭксперт С++
13051 / 7314 / 814
Регистрация: 27.09.2012
Сообщений: 18,050
Записей в блоге: 3
Завершенные тесты: 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
Модератор
Эксперт CЭксперт С++
13051 / 7314 / 814
Регистрация: 27.09.2012
Сообщений: 18,050
Записей в блоге: 3
Завершенные тесты: 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
5251 / 4571 / 1535
Регистрация: 14.04.2014
Сообщений: 18,170
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++
281 / 158 / 61
Регистрация: 22.09.2016
Сообщений: 519
Завершенные тесты: 5
26.09.2016, 10:51     Ошибка при вызове деструктора #13
На самом деле деструктор вызывать через объект напрямую нельзя. Лучше воспользуйтесь динамической инициализацией объекта:

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

Всё надо показывать, а не фрагменты, в которых нет ошибок.
Конструктор копирования и оператор присваивания определены в классе?
Croessmah
Модератор
Эксперт CЭксперт С++
13051 / 7314 / 814
Регистрация: 27.09.2012
Сообщений: 18,050
Записей в блоге: 3
Завершенные тесты: 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
5251 / 4571 / 1535
Регистрация: 14.04.2014
Сообщений: 18,170
26.09.2016, 11:05     Ошибка при вызове деструктора #17
В конструкторе копирования почему память не выделяется как в других?
Оператор присваивания должен ссылку возвращать.
Croessmah
Модератор
Эксперт CЭксперт С++
13051 / 7314 / 814
Регистрация: 27.09.2012
Сообщений: 18,050
Записей в блоге: 3
Завершенные тесты: 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     Ошибка при вызове деструктора
Еще ссылки по теме:

При вызове деструктора возникает ошибка Debug Assertion Failed! - C++
вот код программы #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; class String { private:

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

_BLOCK_TYPE_IS_VALID при вызове деструктора класса - C++
при вызове деструктора моего класса вылетает ошибка _BLOCK_TYPE_IS_VALID(pHead-&gt;nBlockUse) конструкрор копирования создал и оператор =...

Программа выдаёт ошибку при вызове деструктора - C++
Здравствуйте! Есть два шаблона: 1) шаблон двухсвязного списка 2) шаблон файла, для записи двусвязного списка в файл, и для чтения...

Heap corruption при вызове деструктора для char* - C++
в классе есть переменная типа char*, в конструкторе ей выделяется память и записывается значение, в деструкторе пытаюсь ее удалить и...


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

Или воспользуйтесь поиском по форуму:
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     Ошибка при вызове деструктора
Ответ Создать тему
Опции темы

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