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

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

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

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

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

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

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

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

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

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

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

18
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
26.09.2016, 10:12 #2
Цитата Сообщение от Mr_Sorry Посмотреть сообщение
C++
1
A.~Vector();
А зачем Вы его явно вызываете здесь? Уберите.
0
Mr_Sorry
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
26.09.2016, 10:17  [ТС] #3
Да это я так поставил. Суть не в явном вызове, а в его неработоспособности как такового.
0
Invader0x7F
Helper C/C++
281 / 158 / 61
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
26.09.2016, 10:19 #4
Деструкторы не доступны через объект в том случае если объект класса объявлен статически:

C++
1
2
3
    Vector* pA = new Vector();
    A->printVector();
    delete pA; // Вызывает деструктор
Вот так...
0
nmcf
5544 / 4854 / 1647
Регистрация: 14.04.2014
Сообщений: 19,710
26.09.2016, 10:20 #5
Цитата Сообщение от Mr_Sorry Посмотреть сообщение
Просто выдает ошибку.
Какую? Текст давай.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 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 вообще будет знать о том, что памяти нет
и программа упадет при обращении непосредственно к памяти.
0
Mr_Sorry
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
26.09.2016, 10:25  [ТС] #7
Вот ошибка.
0
Миниатюры
Ошибка при вызове деструктора  
Mr_Sorry
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
26.09.2016, 10:26  [ТС] #8
Цитата Сообщение от Croessmah Посмотреть сообщение
условия эти абсолютно бесполезные,
Я это понимаю, но задание велит этот кусок кода использовать.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
26.09.2016, 10:27 #9
Цитата Сообщение от Mr_Sorry Посмотреть сообщение
Я это понимаю, но задание велит этот кусок кода использовать.
Что это за задание такое?
"Написать код содержащий ошибку"?
0
Mr_Sorry
0 / 0 / 0
Регистрация: 30.03.2015
Сообщений: 33
26.09.2016, 10:31  [ТС] #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Что это за задание такое?
"Написать код содержащий ошибку"?
@В переменную состояния устанавливать код ошибки,
когда не хватает памяти, выходит за пределы массива.@

И дан этот кусок для примера.
0
nmcf
5544 / 4854 / 1647
Регистрация: 14.04.2014
Сообщений: 19,710
26.09.2016, 10:43 #11
Исключения используй, если нужно это контролировать.
0
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;
 
}
0
Invader0x7F
Helper C/C++
281 / 158 / 61
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
26.09.2016, 10:51 #13
На самом деле деструктор вызывать через объект напрямую нельзя. Лучше воспользуйтесь динамической инициализацией объекта:

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

Всё надо показывать, а не фрагменты, в которых нет ошибок.
Конструктор копирования и оператор присваивания определены в классе?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
26.09.2016, 10:55 #15
Цитата Сообщение от Mr_Sorry Посмотреть сообщение
Нашел вот такую проблему.
В первом коде этого вообще нет.
0
26.09.2016, 10:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.09.2016, 10:55
Привет! Вот еще темы с ответами:

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

При вызове деструктора возникает ошибка 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) конструкрор копирования создал и оператор =...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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