Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 15.02.2010
Сообщений: 26
1

Зависание на деструкторе.

06.04.2010, 13:55. Просмотров 1119. Ответов 4
Метки нет (Все метки)

Всем доброго времени суток!
Проблема такая: есть класс cData в нём статический член staric int amount, при вызове конструктора увеличиваем amount на 1, в деструкторе уменьшаем на 1, получается что то вроде счётчика сущуствующих экземпляров. В другом классе cDataArray есть члены cData *data1 и cData *data2, для них сначало выделяю динамически память спомощью new, потом пытаясь удалить (delete data1) программа виснет на диструкторе. При дебаге ставлю точку останова на конце диструктора, при попытке выйти из него вылетает сообщение от дебагера "Нет исходного кода для текущего места.". В чём проблема и как можно решить?!

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
// Класс cData:
 
class cData // класс дата
{
    int     year; // год 
    short   mounth; // месяц
    short   day; // день
 
    static int amount; // количество экземпляров класса
 
public:
    cData(); // конструктор по умолчанию
    cData(int n_year, short n_mounth, short n_day); // конструктор с параметрами
    cData(const cData &obj); // конструктор копирования
    ~cData(); // деструктор
    bool SetData(int n_year, short n_mounth, short n_day); //изменение значения
    void IncDay(); // инкремент
    string GetStrData(); // возвращает дату в виде строки
    static int GetAmount(); // возвращает количество экземпляров
};
 
cData::~cData()
{
    amount--;
}
 
// Класс cDataArray:
 
class cDataArray
{
    cData *data1; 
    cData *data2;
    bool use_one; // определяет какой из указателей используется
 
public:
    cDataArray();
    cDataArray(int n_amount);
    ~cDataArray();
    void AddElement(int n_year, short n_mounth, short n_day); // добавление элемента в конец
    bool DeleteElement(int num); // удаление элемента по номеру
    bool SetData(int num, int n_year, short n_mounth, short n_day); //изменение значения
    bool IncDay(int num); // инкремент
    string GetStrData(int num); // возвращает дату в виде строки
    int GetAmount(); // возвращает количество экземпляров
};
 
 
//метод в котором удаляю
void cDataArray::AddElement(int n_year, short n_mounth, short n_day)
{
    int i, kol;
 
    if(use_one)
    {
        kol = data1[0].GetAmount();
        data2 = new cData [kol+1];
 
        for(i=0; i < kol; i++)
        {
            data2[i] = data1[i];
        }
        data2[i].SetData(n_year, n_mounth, n_day);
 
        [COLOR="#ff0000"]delete data1;[/COLOR] // тут виснет
 
        use_one = false;
    }
    else
    {
        kol = data2[0].GetAmount();
        data1 = new cData [kol+1];
 
        for(i=0; i < kol; i++)
        {
            data1[i] = data2[i];
        }
        data1[i].SetData(n_year, n_mounth, n_day);
 
        [COLOR="#ff0000"]delete data2;[/COLOR] // тут виснет
 
        use_one = true;
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2010, 13:55
Ответы с готовыми решениями:

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

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

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

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

4
3075 / 2396 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
06.04.2010, 14:01 2
Если с помощью нью выделять массив, то освобождать память нужно оператором delete []
0
2 / 2 / 0
Регистрация: 15.02.2010
Сообщений: 26
06.04.2010, 14:05  [ТС] 3
Ооо... точно! Сглупил. ) А можешь расказать по подробней почему виснет именно на деструкторе, а не удаляет указатель на память и работает дальше?
0
3075 / 2396 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
06.04.2010, 14:36 4
Делет только освобождает память, указатель он не трогает.
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
06.04.2010, 15:08 5
Цитата Сообщение от -Xeon- Посмотреть сообщение
А можешь расказать по подробней почему виснет именно на деструкторе, а не удаляет указатель на память и работает дальше?
А он может не только зависнуть. Если по new создан массив каких-то объектов, а удаляется он по "простому" (для единичного объекта) delete, то Стандарт языка гарантирует только одно - неопределенное поведение программы. В чем именно будет выражаться это неопределенное поведение - Стандарт не накладывает никаких ограничений и не дает никаких гарантий, хоть что угодно вплоть до "format C:"
Так что считай, если программа просто зависла, то - повезло.....
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2010, 15:08

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Exception throw в деструкторе
Почему-то происходит выброс при вызове деструктора. Деструктор вызывается в main при завершении...

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

Вылет программы на деструкторе
Здравствуйте, подскажите пожалуйста что не так? Программа не корректно завершается #pragma once...

Оператор delete в деструкторе
Здравствуйте, нужна помощь, есть класс и функция к которую передается этот класс: ...


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

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

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