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

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

Войти
Регистрация
Восстановить пароль
 
Nishen
397 / 236 / 79
Регистрация: 26.02.2015
Сообщений: 1,076
Завершенные тесты: 2
#1

Деструктор - C++

15.03.2015, 16:42. Просмотров 266. Ответов 6
Метки нет (Все метки)

Ребята, объясните, пожалуйста, где, как и когда в программе вызывается деструктор? Вот мой пример:
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
#include <iostream>
using namespace std;
 
struct Link{
    int data;
    Link* next;
};
class LinkList{
    private:
        Link* first;
    public:
        LinkList(){
            first = NULL;
        }
        ~LinkList(){
            Link* current = NULL;
            Link* next = first;
            while(next){
                current = next;
                next = next->next;
                delete current;
                cout << "Элемент удален!" << endl;
            }
            delete next;
            cout << "Все элементы удалены!" << endl;
            system("PAUSE");
        }
        void AddItem(int d);
        void Display() const;
};
void LinkList::AddItem(int d){
    Link* newLink = new Link;
    Link* current = first;
    if(!first){
        first = newLink;
    }
    while(current){
        if(!(current->next)){
            current->next = newLink;
            break;
        }
        current = current->next;
    }
    newLink->data = d;
    newLink->next = NULL;
}
void LinkList::Display() const{
    Link* current = first;
    while(current){
        cout << current->data << endl;
        current = current->next;
    }
}
 
int main(){
    setlocale(LC_ALL, "Russian");
    LinkList li;
    li.AddItem(25);
    li.AddItem(36);
    li.AddItem(49);
    li.AddItem(64);
 
    li.Display();
 
    system("PAUSE");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2015, 16:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Деструктор (C++):

Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B - C++
Почему я делаю виртуальным деструктор A, а в таблице виртуальных функций лежит деструктор B?

Деструктор - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #define _CRTDBG_MAP_ALLOC #include &lt;crtdbg.h&gt; using namespace std; class list{ ...

Деструктор - C++
Не понимаю почему в проге не работает строка cout &lt;&lt; &quot;Удаляем элемент списка!&quot;; вроде деструктор вызываеться автоматически, как пишет...

Деструктор - C++
В каком случае необходимо явно определять деструктор?

Деструктор - C++
Вроде все просто но чето никак не работает Задача: Написать программу в которой Конструктор класса MyCl выводит сообщение на...

Деструктор - C++
Добрый вечер!мне нужна одна программа для примера(рабочая),но это тему мы коснулись слегка..хотел попросить у кого есть...

6
zss
Модератор
Эксперт С++
6532 / 6094 / 2007
Регистрация: 18.12.2011
Сообщений: 15,851
Завершенные тесты: 1
15.03.2015, 16:59 #2
Деструктор для LinkList li; вызывается при закрытии программы
(после выполнения return 0).
Для Link* next (не написанный еще) - в строках 21 и 24 при выполнении delete
0
Nishen
397 / 236 / 79
Регистрация: 26.02.2015
Сообщений: 1,076
Завершенные тесты: 2
15.03.2015, 17:03  [ТС] #3
zss, а в моем примере я всю память освободил, выделенную во время программы, или же деструктор нужно организовать как-то иначе? И еще вопрос, можно ли вызвать деструктор явно? Например, я попробовал вставить дестуктор в конец функции Display:
C++
1
2
3
4
5
6
7
8
void LinkList::Display() const{
    Link* current = first;
    while(current){
        cout << current->data << endl;
        current = current->next;
    }
    LinkList::~LinkList();
}
в итоге программа вылетела с ошибкой.
0
zss
Модератор
Эксперт С++
6532 / 6094 / 2007
Регистрация: 18.12.2011
Сообщений: 15,851
Завершенные тесты: 1
15.03.2015, 17:27 #4
Деструктор никогда не вызывают явно.
Если хочется увидеть его раньше, то используйте динамическое выделение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main(){
    setlocale(LC_ALL, "Russian");
    LinkList* li=new LinkList;
    li->AddItem(25);
    li->AddItem(36);
    li->AddItem(49);
    li->AddItem(64);
 
    li->Display();
 
    delete li;
    system("PAUSE");
    return 0;
}
1
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
15.03.2015, 17:54 #5
Цитата Сообщение от zss Посмотреть сообщение
Деструктор никогда не вызывают явно.
Ну почему же. Это часто применяется при использовании placement new. На днях видел практическое применение, но не могу вспомнить где... Как вспомню - обязательно скажу.
2
Nishen
397 / 236 / 79
Регистрация: 26.02.2015
Сообщений: 1,076
Завершенные тесты: 2
15.03.2015, 17:55  [ТС] #6
А что насчет
Цитата Сообщение от Nishen Посмотреть сообщение
в моем примере я всю память освободил, выделенную во время программы, или же деструктор нужно организовать как-то иначе
0
castaway
15.03.2015, 18:16     Деструктор
  #7

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
Как вспомню - обязательно скажу.
Вспомнил. Так работает allocator, деструктор вызывает метод destroy.

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2015, 18:16
Привет! Вот еще темы с ответами:

Деструктор - C++
Я написал деструктор, но препод сказал переделать так как надо было смотреть на то, как я выделял память. Помогите исправить. int **m6; ...

деструктор - C++
опять же проблема с лабой. помоги дописать деструктор. #include &quot;stdafx.h&quot; #include &lt;string&gt; #include &lt;iostream&gt; using...

Деструктор - C++
Доброго времени суток, есть некоторый класс и 2 функции подобны тем, что описаны ниже. В первой объявляется данный класс, обрабатывается и...

деструктор - C++
Для освобождения памяти динамически выделенных массивам надо использовать delete. требуется ли освобождать память выделенную под простой...


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

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

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