Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Nishen
456 / 279 / 154
Регистрация: 26.02.2015
Сообщений: 1,321
Завершенные тесты: 2
#1

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

15.03.2015, 16:42. Просмотров 290. Ответов 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;
}

http://www.cyberforum.ru/cpp-beginners/thread1082152.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2015, 16:42
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Деструктор (C++):

Деструктор
здравствуйте. подскажите пожалуйста ... почему деструктор некорректно работает...

Деструктор
Не понимаю почему в проге не работает строка cout &lt;&lt; &quot;Удаляем элемент списка!&quot;;...

Деструктор!
Как вызвать деструктор? #include &lt;iostream&gt; #include &lt;conio.h&gt; #include...

Деструктор
#include &lt;iostream&gt; #include &lt;conio.h&gt; #define _CRTDBG_MAP_ALLOC #include...

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

6
zss
Модератор
Эксперт С++
6953 / 6515 / 4136
Регистрация: 18.12.2011
Сообщений: 17,186
Завершенные тесты: 1
15.03.2015, 16:59 #2
Деструктор для LinkList li; вызывается при закрытии программы
(после выполнения return 0).
Для Link* next (не написанный еще) - в строках 21 и 24 при выполнении delete
0
Nishen
456 / 279 / 154
Регистрация: 26.02.2015
Сообщений: 1,321
Завершенные тесты: 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
Модератор
Эксперт С++
6953 / 6515 / 4136
Регистрация: 18.12.2011
Сообщений: 17,186
Завершенные тесты: 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
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
15.03.2015, 17:54 #5
Цитата Сообщение от zss Посмотреть сообщение
Деструктор никогда не вызывают явно.
Ну почему же. Это часто применяется при использовании placement new. На днях видел практическое применение, но не могу вспомнить где... Как вспомню - обязательно скажу.
2
Nishen
456 / 279 / 154
Регистрация: 26.02.2015
Сообщений: 1,321
Завершенные тесты: 2
15.03.2015, 17:55  [ТС] #6
А что насчет
Цитата Сообщение от Nishen Посмотреть сообщение
в моем примере я всю память освободил, выделенную во время программы, или же деструктор нужно организовать как-то иначе
0
castaway
15.03.2015, 18:16     Деструктор
  #7

Не по теме:

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

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

Деструктор
Доброго времени суток, есть некоторый класс и 2 функции подобны тем, что...

Деструктор
Вроде все просто но чето никак не работает Задача: Написать программу в...

деструктор
опять же проблема с лабой. помоги дописать деструктор. #include &quot;stdafx.h&quot;...

Деструктор
Здравствуйте, все работает отлично, но когда я добавила деструктор, то сразу...


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

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

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