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

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

Восстановить пароль Регистрация
 
-Xeon-
2 / 2 / 0
Регистрация: 15.02.2010
Сообщений: 26
06.04.2010, 13:55     Зависание на деструкторе. #1
Всем доброго времени суток!
Проблема такая: есть класс 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;
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2010, 13:55     Зависание на деструкторе.
Посмотрите здесь:

Повисание в деструкторе C++
Зачем фигурные скобки в деструкторе? C++
C++ Ошибка в деструкторе
C++ Классы - ошибка в деструкторе
Оператор delete в деструкторе C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
06.04.2010, 14:01     Зависание на деструкторе. #2
Если с помощью нью выделять массив, то освобождать память нужно оператором delete []
-Xeon-
2 / 2 / 0
Регистрация: 15.02.2010
Сообщений: 26
06.04.2010, 14:05  [ТС]     Зависание на деструкторе. #3
Ооо... точно! Сглупил. ) А можешь расказать по подробней почему виснет именно на деструкторе, а не удаляет указатель на память и работает дальше?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
06.04.2010, 14:36     Зависание на деструкторе. #4
Делет только освобождает память, указатель он не трогает.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
06.04.2010, 15:08     Зависание на деструкторе. #5
Цитата Сообщение от -Xeon- Посмотреть сообщение
А можешь расказать по подробней почему виснет именно на деструкторе, а не удаляет указатель на память и работает дальше?
А он может не только зависнуть. Если по new создан массив каких-то объектов, а удаляется он по "простому" (для единичного объекта) delete, то Стандарт языка гарантирует только одно - неопределенное поведение программы. В чем именно будет выражаться это неопределенное поведение - Стандарт не накладывает никаких ограничений и не дает никаких гарантий, хоть что угодно вплоть до "format C:"
Так что считай, если программа просто зависла, то - повезло.....
Yandex
Объявления
06.04.2010, 15:08     Зависание на деструкторе.
Ответ Создать тему
Опции темы

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