Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
11 / 1 / 1
Регистрация: 02.10.2015
Сообщений: 98
1

Не вызывается деструктор структуры

02.06.2016, 15:58. Просмотров 3573. Ответов 9
Метки нет (Все метки)

Создал класс. Членом класса является указатели на структуру, которая определена в классе. Поля структуры указатели, т.к. работа будет с дим. данными.

Создал для структуры конструктор и деструктор.
Начал проверку. Создал экземпляр класса и один объект структуры. Завершаю программу. Деструтор класса вызывается, а структуры нет. Почему?
C++
1
2
3
4
5
6
7
8
9
10
11
12
class A {
  private:
    struct B{
      char*  title;
      ....
      ~B(){
        cout << "Destructor for B is work" << endl; system ("pause");
        delete [] title;
    }
      } 
     B* p;
}
Условно , как у меня...полный код , если надо приведу.
Еще раз...почему деструктор струкуры не вызывается при выходе из области , а класса вызывается. И как решить данную проблему?

ЗЫ. я организовал фатически двусвязный список линейный. Элемент списка структура. Члены данные класса указатели на начало/конец+еще пару полей.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2016, 15:58
Ответы с готовыми решениями:

При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
Вот такой кодclass A { public: A(){} virtual ~A(){} }; class C { public:

Не вызывается деструктор
#include &lt;iostream&gt; using namespace std; class myclass { int a; public: myclass(); //...

Не вызывается деструктор
_Здравствуйте. Я новичок в программировании, сейчас изучаю самостоятельно С++ по книге Джесса...

Деструктор не вызывается
В одном классе я создаю объект, и если проверку не проходит, я его возвращаю в другой метод, дабы...

9
Don't worry, be happy
16958 / 9839 / 1895
Регистрация: 27.09.2012
Сообщений: 24,392
Записей в блоге: 2
02.06.2016, 16:04 2
Цитата Сообщение от Oryel Посмотреть сообщение
Еще раз...почему деструктор струкуры не вызывается при выходе из области , а класса вызывается.
Всё вызывается.
Давайте минимальный компилируемый код, демонстрирующий проблему,
а не кусок не пойми откуда выдранный.

P.S. B* p; - это указатель и будет уничтожен сам указатель, а не данные, на которые он указывает.
1
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
02.06.2016, 16:05 3
Ты меня запутал. Ты же сказал, что создал один объект структуры, тогда в чём проблема, если деструктор вызывается?
0
Эксперт С++
4967 / 3073 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
02.06.2016, 16:12 4
Цитата Сообщение от no_attention Посмотреть сообщение
Ты меня запутал. Ты же сказал, что создал один объект структуры, тогда в чём проблема, если деструктор вызывается?
Минимальный пример воспроизводящий проблему покажи. Где создаётся объект, как создаётся объект и т.п.
0
11 / 1 / 1
Регистрация: 02.10.2015
Сообщений: 98
02.06.2016, 16:20  [ТС] 5
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
class mybible {
    
    
    public:
        struct mybook{
            unsigned char date;
            unsigned char ID;
            char*  title;
            char* author;
            char* publication;
            mybook* p_rev;
            mybook* p_next;
            //*онструктор и деструктор структуры 
            mybook(): date(0), ID(0), title(0), author(0), publication(0), p_rev(0), p_next(0) { 
                cout << "Constroctor for book is work" <<  endl; system ("pause");
            }
 
            ~mybook(){
                cout << "Destructor for book is work" << endl; system ("pause");
                delete [] title; 
                delete [] author; delete [] publication; 
                cout << "Destructor for book is work" << endl; system ("pause");
            }
        };
        mybook* p_head;
        mybook* p_tail;
        static unsigned char number_books;
 
 
    public: 
        mybible() : p_head( 0 ), p_tail( 0 ) { cout << "Costructor for bible is work" << endl; system ("pause");} //  конструктор по умолчанию
        ~mybible();                                                                 // destructor
        //------------------------------ Methods for the count
        static bool MinusCount( void ) { if( number_books ) { number_books--; return 0; } return 1;  }
        static void PlusCount( void ) { number_books++; }
        static unsigned char GetCount( void ) { return number_books; }
    bool AppEndBook();}
Заголовочный дальше идут просто обхъявления других членов


определение метода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool mybible:: AppEndBook() {
    
    if ( ( p_head == 0 ) && ( p_tail == 0 )) {
        // значит это первый элемент верно ли адрес беру?
        mybook *temp = new mybook;
        temp-> p_rev = 0;
        temp-> p_next = 0;
        p_head = temp;
        p_tail = temp;
    } 
    else {
        mybook *temp = new mybook;
        temp-> p_rev = p_head;
        temp-> p_next = 0;
        p_head -> p_next = temp;
        p_head = temp;
    }
 
    return false;   
}

main
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main(){
 
cout << "This programm strart" << endl;
mybible a;
cout << a.p_head << endl << a.p_tail << endl;
a.AppEndBook();
cout << a.p_head << endl << a.p_tail << endl;
system ("pause");
//a.p_head->~mybook();
//a.p_head->~mybook();
return 0;
}
результат на консоле:
C++
1
2
3
4
5
6
7
8
9
10
11
12
This programm strart
Costructor for bible is work
Для продолжения нажмите любую клавишу . . .
00000000
00000000
Constroctor for book is work
Для продолжения нажмите любую клавишу . . .
00195828
00195828
Для продолжения нажмите любую клавишу . . .
Destructor for bible is work
Для продолжения нажмите любую клавишу . . .
На мои комментарии внимания не обращайте ...из консоли видно...структура создалась, но ее деуструктор не вызвался..вот интересно почему
0
Don't worry, be happy
16958 / 9839 / 1895
Регистрация: 27.09.2012
Сообщений: 24,392
Записей в блоге: 2
02.06.2016, 16:26 6
Цитата Сообщение от Oryel Посмотреть сообщение
вот интересно почему
Объект создали, но никто его не уничтожает.
То, что выделяется руками - освобождается тоже руками.
Автоматически удаляются только объекты с статическим, потоковым и автоматическим временем хранения.
new - создает объекты с динамическим временем хранения,
за их создание и удаление отвечаете Вы сами.
C++
1
2
3
~mybible(){
//тут код для удаления объектов списка
}
0
Эксперт С++
4967 / 3073 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
02.06.2016, 16:36 7
А где вы удаляете объекты типа mybook через delete?
0
11 / 1 / 1
Регистрация: 02.10.2015
Сообщений: 98
02.06.2016, 16:47  [ТС] 8
C++
1
2
3
4
mybible::~mybible() {
    cout << "Destructor for bible is work" << endl; 
    system ("pause");
}
Забыл привести

Объект библ удаляю, через деструктор. Почему деструктор структуры автоматически не вызывается. ?:?:
И какие хорошие пути решения есть или исправления.?

Добавлено через 2 минуты
Т.е. я сам их удалять должен. Я почему -то думаю , что при выходе из области должен вызваться деструктор.
Поэтому ручного удаления я не предусмотрел (была идея при уничтожении библ пройтись по списку и удалять, но подумал, что само как-то)

А как реализовать и есть ли такая возможность более элегантного решения?
0
Don't worry, be happy
16958 / 9839 / 1895
Регистрация: 27.09.2012
Сообщений: 24,392
Записей в блоге: 2
02.06.2016, 16:48 9
Цитата Сообщение от Oryel Посмотреть сообщение
Почему деструктор структуры автоматически не вызывается. ?
А с чего он должен?
Цитата Сообщение от Oryel Посмотреть сообщение
И какие хорошие пути решения есть или исправления.?
Удалять самому или использовать идиому RAII, в частности "умные указатели".
Только здесь это не факт что поможет.
Что мешает нормальный список сделать?
Зачем вся эта возня си-подобными способами?
Цитата Сообщение от Oryel Посмотреть сообщение
А как реализовать и есть ли такая возможность более элегантного решения?
std::list
0
11 / 1 / 1
Регистрация: 02.10.2015
Сообщений: 98
02.06.2016, 17:05  [ТС] 10
Я ООП изучаю (начало пути). Прошел первую тему пару классов создал отладил. Вот взял задачку из учебника. Поэтому такая возня.
Спасибо за помощь
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.06.2016, 17:05

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

Почему вызывается деструктор?
Доброго времени суток. Написал такой код: struct O { virtual ~O() { cout...

Почему не вызывается деструктор?
Всем доброго времени суток! Подскажите пожалуйста - почему не вызывается деструктор при...

Когда вызывается деструктор класса?
Вопрос собственно в том, когда происходит освобождение памяти, занимаемой объектом класса? Допустим...

Вызывается ли деструктор в данной программе?
вызывается ли деструктор в данной программе и почему он не выводит на экран,что он...


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

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

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