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

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

Войти
Регистрация
Восстановить пароль
 
-Xeon-
2 / 2 / 0
Регистрация: 15.02.2010
Сообщений: 26
#1

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

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

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

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

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

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

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

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

Освобождение памяти в деструкторе - 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++
Изучаю C++, хочу уточнить вопрос об указателях... Например, есть такой код: class Obj { public: Obj() {}; ~Obj()...

удаление динамеческого массива в деструкторе - C++
#include &lt;iostream&gt; #include &lt;time.h&gt; using namespace std; class Matrix { public: int right,left,i; friend int...

Освобождение памяти в деструкторе класса - C++
Перечитал по этому поводу много информации. Главный вопрос. Есть класс в котором происходит динамическое выделение памяти. В...

Зачем фигурные скобки в деструкторе? - C++
Доброй ночи! Мой код: #include &lt;iostream&gt; using namespace std; class Rectangle


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
3033 / 2354 / 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
3033 / 2354 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
06.04.2010, 14:36     Зависание на деструкторе. #4
Делет только освобождает память, указатель он не трогает.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,354
06.04.2010, 15:08     Зависание на деструкторе. #5
Цитата Сообщение от -Xeon- Посмотреть сообщение
А можешь расказать по подробней почему виснет именно на деструкторе, а не удаляет указатель на память и работает дальше?
А он может не только зависнуть. Если по new создан массив каких-то объектов, а удаляется он по "простому" (для единичного объекта) delete, то Стандарт языка гарантирует только одно - неопределенное поведение программы. В чем именно будет выражаться это неопределенное поведение - Стандарт не накладывает никаких ограничений и не дает никаких гарантий, хоть что угодно вплоть до "format C:"
Так что считай, если программа просто зависла, то - повезло.....
Yandex
Объявления
06.04.2010, 15:08     Зависание на деструкторе.
Ответ Создать тему
Опции темы

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