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

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

Восстановить пароль Регистрация
 
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
05.01.2013, 15:54     Ошибка в деструкторе #1
есть базовый абстрактный класс и есть производный от него:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef EMPLOY_H
#define EMPLOY_H
 
class Employee
{
    public:
        Employee(const char*, const char*);
        ~Employee();
        const char* getFirstName() const;
        const char* getLastName() const;
 
        //чистые виртуальные функции абстрактного класса Employee
        virtual float earnings() const = 0;
        virtual void print() const = 0; 
 
    private:
        char *FirstName;
        char *LastName;
};
 
#endif EMPLOY_H
теперь описание

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
#include "stdafx.h"
#include "Employee.h" 
#include <string.h>
#include <assert.h>
 
Employee::Employee(const char *first, const char *last)
{
    FirstName = new char(strlen(first) + 1);
    assert(FirstName != 0);                     //проверка работы new
    strcpy(FirstName, first);
 
    LastName = new char(strlen(last) + 1);
    assert(LastName != 0);                      //проверка работы new
    strcpy(LastName, last);
}
 
Employee::~Employee()
{
    if(FirstName != NULL)
    {
        delete []FirstName;
    }
 
    if(LastName != NULL)
    {
        delete []LastName;
    }
}
 
const char* Employee::getFirstName() const
{
    return FirstName;
}
 
const char* Employee::getLastName() const
{
    return LastName;
}
теперь производный класс

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef BOSS_H
#define BOSS_H
#include "Employee.h" 
 
class Boss:public Employee
{
    public:
        Boss(const char*, const char*, float = 0);
        void setWeeklySalary(float);
        ~Boss();
 
        //виртуальные функции
        virtual float earnings() const;
        virtual void print() const; 
 
    private:
        float WeeklySalary;
};
 
#endif BOSS_H
и описание

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
#include "stdafx.h"
#include "Boss.h" 
#include <iostream>
using namespace std;
 
Boss::Boss(const char *first, const char *last, float s):Employee(first, last)
{
    setWeeklySalary(s);
}
 
Boss::~Boss() {};
 
//установка еженедельного оклада для класса Boss
void Boss::setWeeklySalary(float s)
{
    WeeklySalary = s > 0 ? s : 0;
}
 
//наличие заработной платы
float Boss::earnings() const
{
    return WeeklySalary;
}
 
//печать имени служащего из класса Boss
void Boss::print() const
{
    cout << "\nАдминистратор: " << getFirstName() << "\t" << getLastName();
}
Теперь мейн:

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
#include "stdafx.h"
#include "Employee.h" 
#include "Boss.h" 
#include "ComissionWorker.h"
#include "PieceWorker.h"
#include "HorlyWorker.h"
#include "Boss.h" 
#include <iostream>
#include <iomanip>
#include <windows.h>  
using namespace std;
 
void _tmain()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    //установка выходного формата
    cout << setiosflags(ios::showpoint) << setprecision(2);
 
    Employee *ptr;
 
    Boss b("John", "Smith", 800);
    ptr = &b;                       //указатель базового класса на объект производного
 
    ptr -> print();                 //динамическое связывание
    cout << " заработал $ " << ptr -> earnings();
            
    b.print();                      //статическое связывание
    cout << " заработал $ " << b.earnings();
 
    cout << "\n\n";
}
выдает ошибку HEAP CORRUPTION DETECTED: after Normal block(#178) at 0x00398CA0. CRT detected that the application
wrote to memory after end on heap buffer. Заранее благодарю!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
05.01.2013, 16:26     Ошибка в деструкторе #2
Цитата Сообщение от yoghurt92 Посмотреть сообщение
assert(LastName != 0); //проверка работы new
new бросает исключение, и никакая проверка на 0/NULL не сработает

Цитата Сообщение от yoghurt92 Посмотреть сообщение
~Employee();
деструктор базового класса нужно сделать виртуальным

Добавлено через 2 минуты
Цитата Сообщение от yoghurt92 Посмотреть сообщение
FirstName = new char(strlen(first) + 1);
тут вы создаете один символ (а не массив)
Цитата Сообщение от yoghurt92 Посмотреть сообщение
delete []FirstName;
а в деструкторе удаляете как массив, скорее всего ошибка из-за этого,
к тому же перед delete вовсе нет необходимости делать проверку на 0/NULL
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
05.01.2013, 16:41  [ТС]     Ошибка в деструкторе #3
Сделал все как вы сказали, не помогло...
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
05.01.2013, 16:48     Ошибка в деструкторе #4
Цитата Сообщение от yoghurt92 Посмотреть сообщение
Сделал все как вы сказали, не помогло...
что сделали?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Employee::Employee(const char *first, const char *last)
{
    FirstName = new char[strlen(first) + 1]();
    strcpy(FirstName, first);
 
    LastName = new char[strlen(last) + 1]();
    strcpy(LastName, last);
}
 
Employee::~Employee()
{
    delete [] FirstName;
    delete [] LastName;
}
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
05.01.2013, 16:52  [ТС]     Ошибка в деструкторе #5
Сделал деструктор виртуальным, убрал [] в теле деструктора и в конструкторе убрал функцию assert...
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
05.01.2013, 17:08     Ошибка в деструкторе #6
Цитата Сообщение от yoghurt92 Посмотреть сообщение
Сделал деструктор виртуальным,
Цитата Сообщение от yoghurt92 Посмотреть сообщение
в конструкторе убрал функцию assert...
ок, но про выделение памяти ты видно не понял
C++
1
2
FirstName = new char(strlen(first) + 1); 
//это - создание одного символа со  значением (strlen(first) + 1), а НЕ (strlen(first) + 1) символов
для создания массива нужны квадратные скобки, как в коде в 4-м посте темы
Цитата Сообщение от yoghurt92 Посмотреть сообщение
убрал [] в теле деструктора
это верни обратно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2013, 17:15     Ошибка в деструкторе
Еще ссылки по теме:

C++ Ошибка в деструкторе
Вылет программы на деструкторе C++
C++ Об удалении указателя в деструкторе класса

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

Или воспользуйтесь поиском по форуму:
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
05.01.2013, 17:15  [ТС]     Ошибка в деструкторе #7
понял, тупонул... спасибо!
Yandex
Объявления
05.01.2013, 17:15     Ошибка в деструкторе
Ответ Создать тему
Опции темы

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