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

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

Войти
Регистрация
Восстановить пароль
 
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
#1

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

05.01.2013, 15:54. Просмотров 418. Ответов 6
Метки нет (Все метки)

есть базовый абстрактный класс и есть производный от него:

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

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

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

Классы - ошибка в деструкторе - C++
У меня сейчас такое &quot;задание&quot;: опередить класс длинного целого числа (длинная арифметика), для сохранения которого необходимо использовать...

Возникает ошибка при удалении динамического массива символов в деструкторе класса - C++
Всем привет. Есть приватная переменная, указатель на строку wchar_t *pUAgent; В конструкторе я ее инициализирую: pUAgent =...

При работе с free в деструкторе ошибка "Invalid address specified to RtlValidateHeap" - C++
Доброго времени суток, господа эксперты и дамы эксперты. Объясните пожалуйста почему программа вылетает с ошибкой &quot;program.exe has...

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

6
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 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
0
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
05.01.2013, 16:41  [ТС] #3
Сделал все как вы сказали, не помогло...
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 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;
}
0
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
05.01.2013, 16:52  [ТС] #5
Сделал деструктор виртуальным, убрал [] в теле деструктора и в конструкторе убрал функцию assert...
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 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 Посмотреть сообщение
убрал [] в теле деструктора
это верни обратно
1
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
05.01.2013, 17:15  [ТС] #7
понял, тупонул... спасибо!
0
05.01.2013, 17:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2013, 17:15
Привет! Вот еще темы с ответами:

Зависание на деструкторе. - C++
Всем доброго времени суток! Проблема такая: есть класс cData в нём статический член staric int amount, при вызове конструктора...

Освобождение памяти в деструкторе - C++
Здравствуйте у меня есть три класса: class Date { int iDay, iMonth, iYear; public: Date(); Date(Date&amp;); Date(int Day,...

Оператор delete в деструкторе - C++
Здравствуйте, нужна помощь, есть класс и функция к которую передается этот класс: #include&lt;iostream&gt; using namespace std; class...

Вылет программы на деструкторе - C++
Здравствуйте, подскажите пожалуйста что не так? Программа не корректно завершается #pragma once #pragma warning(disable:4996) ...


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

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

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