Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
2 / 1 / 1
Регистрация: 22.12.2019
Сообщений: 93

Деструктор. Когда он нужен ?

08.09.2020, 22:44. Показов 2882. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуйте! Меня интересует вопрос: когда требуется явное определение деструктора в классе ? Я знаю тонкости по освобождению памяти(вернее ее утечку) в случае работы с динамической памятью внутри класса. Однако бывают случаи, когда без явного определения деструктора(даже по умолчанию) программа просто не собирается( Почему? Когда компилятор хочет некой подсказки ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.09.2020, 22:44
Ответы с готовыми решениями:

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

Вызывается деструктор когда обьект не уничтожен!
#include "stdafx.h" #include <iostream> #include <conio.h> using namespace std; class inkr { private: int a; ...

Нужен ли деструктор?
Вопрос туп, но что-то переклинило, извиняйте. Делаю в Qt. class A { QList<int>* list public: A() { list = new...

4
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.09.2020, 22:47
Цитата Сообщение от Novichekk Посмотреть сообщение
когда без явного определения деструктора(даже по умолчанию) программа просто не собирается
Например? Где код демострирующий проблему?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
09.09.2020, 00:10
Цитата Сообщение от Novichekk Посмотреть сообщение
Однако бывают случаи, когда без явного определения деструктора(даже по умолчанию) программа просто не собирается
Ну например, если вы объявите деструктор своего класса как pure virtual, т.е. = 0, то вам придется отдельно определить его руками.

Но о каких именно случаях ведете речь вы, я не знаю.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.09.2020, 05:20
Цитата Сообщение от Novichekk Посмотреть сообщение
Однако бывают случаи, когда без явного определения деструктора(даже по умолчанию) программа просто не собирается( Почему?
например вот такая ситуация:

C++
1
2
3
4
5
6
7
8
9
10
// foo.h
#include <memory>
 
struct bar;
struct foo
{
    using bar_t = std::shared_ptr<bar>;
    void make(); // create bar in foo.cpp
    bar_t  m_bar;
};
C++
1
2
3
4
5
6
7
8
// foo.cpp
#include "foo.h"
 
struct bar {};
void foo::make()
{
    m_bar = new bar();
};
C++
1
2
3
4
5
6
7
8
// main.cpp
#include "foo.cpp"
 
int main()
{
    foo obj;
    obj.make(); // <--- upsss
}
что здесь происходит?
у класса foo отсутствует явно прописанный пользователем деструктор.
а значит компилятор должен сгенерировать его по умолчанию.

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

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

в нашем случае у нас есть только одно место, где нужен деструктор: в файле main.cpp
именно здесь создается единственный автоматический объект obj,
для которого требуется вызвать деструктор.

проблема в том, что в данной ед. трансляции тип данных bar является не полным.
и компилятор не сможет сгенерировать код его разрушения.

если же явно определить деструктор в файле foo.cpp,
в котором bar уже является полным типом и легко может быть разрушен,
тогда такой проблемы не возникнет.

трюк с форвард-объявлением часто используют для реализации идиомы pImpl

обычно люди, которые используют pImpl (или rImpl)
не забывают про особенность с деструктором.
но если ничайно забудешь - не беда.
скорее всего компилятор (или линкер) тебе напомнят.
2
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
09.09.2020, 10:22
Цитата Сообщение от Novichekk Посмотреть сообщение
Деструктор. Когда он нужен ?
Мейерс пишет:

Итак, компилятор пишет эти функции для вас, но что они делают? Конструктор по
умолчанию и деструктор – это места, в которые компилятор помещает служебный код,
например вызов конструкторов и деструкторов базовых классов и нестатических данных-
членов. Отметим, что сгенерированный деструктор не является виртуальным (см. правило
7), если только речь не идет о классе, наследующем классу, у которого есть виртуальный
деструктор (в этом случае виртуальность наследуется от базового класса).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.09.2020, 10:22
Помогаю со студенческими работами здесь

нужен ли свой деструктор
Есть класс class Vetv { public: Vetv(int a,int b, int *ves); Vetv(); virtual ~Vetv(void); int nFrom; int nTo; int...

Нужен ли в программе деструктор
Объясните пожалуйста, нужен ли в программе деструктор? #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; ...

Зачем нужен virtual деструктор?
Зачем нужен виртуальный деструктор? Например есть базовый абстрактный класс в длл-ке и в нем прописан виртуальный деструктор, зачем он...

Виртуальный деструктор, для чего нужен?
Я конечно понимаю, что Но объясните поподробнее и попонятнее для чего это нужно

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru