0 / 0 / 0
Регистрация: 31.05.2018
Сообщений: 60
1

Exception throw в деструкторе

21.10.2018, 16:49. Показов 2044. Ответов 8
Метки нет (Все метки)

Почему-то происходит выброс при вызове деструктора. Деструктор вызывается в main при завершении программы. Деструктор для полей, память которым выделили через new. В чём ошибка?
Миниатюры
Exception throw в деструкторе   Exception throw в деструкторе  
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2018, 16:49
Ответы с готовыми решениями:

Const throw(), наследование от класса exception
В принципе, проблема решена, но хочу разобраться. Код в MSVS: #include <iostream> #include...

First chance exception at $77ADB09E. Exception class EAccessViolation with message 'Access Violation'. Process
Объясните в каких случаях возникает эта ошибка, из-за чего? Как справиться с этой ошибкой? Только...

Unhandled exception at at 0x75E717D2 in ConsoleApplication24.exe: Microsoft C++ exception: std::out_of_range at memory l
Здравствуйте, помогите пожалуйста, при проходе через последний цикл выдаёт вот такую ошибку:...

Выдаёт ошибку "Unhandled exception at 0x00007F exception: std::bad_alloc in memory location"
Добрый день, друзья не могли бы помочь разобраться, почему выдаёт такую ошибку? Вот #include...

8
1385 / 1016 / 322
Регистрация: 28.07.2012
Сообщений: 2,804
21.10.2018, 16:51 2
Цитата Сообщение от AlexOblom Посмотреть сообщение
В чём ошибка?
Покажи весь класс целиком.
0
0 / 0 / 0
Регистрация: 31.05.2018
Сообщений: 60
21.10.2018, 16:52  [ТС] 3
nonedark2008,
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
struct DataPerson
{
public:
    DataPerson(size_t N, const char* Rep , int Age, const char* Date , int Month ,
        int Year , int Num , int BP , const char* Type );
    DataPerson();
    ~DataPerson();
 
    char* GetDate();
    char* GetRep();
    char* GetType();
    size_t GetN();
    int GetAge();
    int GetMonth();
    int GetYear();
    int GetNum();
    int GetBP();
 
private:
    size_t N_;
    char* Rep_;
    int Age_;
    char* Date_;
    int Month_;
    int Year_;
    int Num_;
    int BP_;
    char* Type_;
};
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
// DataPerson methods
 
    DataPerson::DataPerson(size_t N = 0, const char* Rep = "No data", int Age = 0, const char* Date = "No data", int Month = 0,
        int Year = 0, int Num = 0, int BP = 0, const char* Type = "No data")
        : N_(N), Age_(Age), Month_(Month), Year_(Year), Num_(Num), BP_(BP)
    {
        Date_ = new char[strlen(Date)];
        Rep_ = new char[strlen(Rep)];
        Type_ = new char[strlen(Type)];
        strcpy(Rep_, Rep);
        strcpy(Date_, Date);
        strcpy(Type_, Type);
 
    }
    DataPerson::DataPerson() : N_(0), Age_(0), Month_(0), Year_(0), Num_(0), BP_(0)
    {
        Date_ = new char[8];
        Rep_ = new char[8];
        Type_ = new char[8];
        strcpy(Rep_, "No Data");
        strcpy(Date_, "No Data");
        strcpy(Type_, "No Data");
 
    }
    DataPerson::~DataPerson() {
        delete [] Rep_;
        delete [] Date_;
        delete [] Type_;
    }
    char * DataPerson::GetDate() {
        return Date_;
    }
    char* DataPerson::GetRep() {
        return Rep_;
    }
    char* DataPerson::GetType() {
        return Type_;
    }
    size_t DataPerson::GetN() {
        return N_;
    }
    int DataPerson::GetAge() {
        return Age_;
    }
    int DataPerson::GetMonth() {
        return Month_;
    }
    int DataPerson::GetYear() {
        return Year_;
    }
    int DataPerson::GetNum() {
        return Num_;
    }
    int DataPerson::GetBP() {
        return BP_;
    }
 
 
    // End of DataPerson methods
0
141 / 110 / 30
Регистрация: 20.04.2011
Сообщений: 581
21.10.2018, 16:54 4
Вообще в С++ лучше использовать std::string, std::vector и т.п. вместо такого.
0
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
21.10.2018, 16:56 5
Лучший ответ Сообщение было отмечено AlexOblom как решение

Решение

Date_ = new char[strlen(Date)];
Rep_ = new char[strlen(Rep)];
Type_ = new char[strlen(Type)];
Для хранения строки нужно strlen+1 памяти (для нульбайта)
Выбивает скорее всего при проверке границ освобождаемой памяти
1
15871 / 8634 / 2114
Регистрация: 30.01.2014
Сообщений: 14,860
21.10.2018, 16:57 6
Лучший ответ Сообщение было отмечено AlexOblom как решение

Решение

Цитата Сообщение от AlexOblom Посмотреть сообщение
C++
1
2
3
        Date_ = new char[strlen(Date)];
        Rep_ = new char[strlen(Rep)];
        Type_ = new char[strlen(Type)];
C++
1
2
3
        Date_ = new char[strlen(Date) + 1];
        Rep_ = new char[strlen(Rep) + 1];
        Type_ = new char[strlen(Type) + 1];
1
1385 / 1016 / 322
Регистрация: 28.07.2012
Сообщений: 2,804
21.10.2018, 17:43 7
AlexOblom, предполагаю, что помимо вышесказанного проблема в отсутствии конструктора копирования и оператора присваивания.
0
0 / 0 / 0
Регистрация: 31.05.2018
Сообщений: 60
21.10.2018, 19:03  [ТС] 8
nonedark2008, в данной реализации они пока не нужны
0
15871 / 8634 / 2114
Регистрация: 30.01.2014
Сообщений: 14,860
21.10.2018, 19:05 9
Цитата Сообщение от AlexOblom Посмотреть сообщение
в данной реализации они пока не нужны
Тогда их надо явно запретить, чтобы компилятор подсказал если что.

Добавлено через 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
struct DataPerson
{
public:
    DataPerson(size_t N, const char* Rep , int Age, const char* Date , int Month ,
        int Year , int Num , int BP , const char* Type );
    DataPerson();
    ~DataPerson();
 
// FIX
    DataPerson &operator=(DataPerson const &) = delete;
    DataPerson(DataPerson const &) = delete;
// /FIX 
    char* GetDate();
    char* GetRep();
    char* GetType();
    size_t GetN();
    int GetAge();
    int GetMonth();
    int GetYear();
    int GetNum();
    int GetBP();
 
private:
    size_t N_;
    char* Rep_;
    int Age_;
    char* Date_;
    int Month_;
    int Year_;
    int Num_;
    int BP_;
    char* Type_;
};
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.10.2018, 19:05
Помогаю со студенческими работами здесь

Ошибка в деструкторе
есть базовый абстрактный класс и есть производный от него: #ifndef EMPLOY_H #define EMPLOY_H ...

Ошибка в деструкторе
Программа работает без ошибок и полный её код не выкладываю. Но при выходе из программы получаю вот...

Ошибка в деструкторе
Когда удаляю объект класса hotel, в деструкторе вызывается delete для поля этого объекта -...

Повисание в деструкторе
Есть такой код: //staff.h class staff abstract { protected: int salary; char* name;...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru