С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
6 / 6 / 0
Регистрация: 23.03.2021
Сообщений: 74

Порядок создания и уничтожения динамических объектов в классе

26.03.2021, 11:07. Показов 1673. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программирую на С++, создавая динамические объекты на электронной карте.
Вопрос связан с созданием к конструкторе класса новых динамических объектов, а также их уничтожением в диструкторе этого же класса.
Вопрос такой, требуется ли в диструкторе уничтожать объекты в порядке обратном по отношению к тому порядку, что был в конструкторе и насколько это важно?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.03.2021, 11:07
Ответы с готовыми решениями:

Анимации создания и уничтожения объектов
Добрый день! Есть набор различных объектов Моделей животных. У каждого вида животных свой набор поведений, но все они наследуют от класса...

Реализовать внешние функции для создания и уничтожения объектов класса
Здравствуйте, имеется вот такое задание: Создайте класс с закрытыми конструкторами и деструктором. Реализуйте внешние функции для...

Создания динамических объектов
Здравствуйте.) Создаю динамические GroupBox на динамически создающихся TabSheet в PageControl. В GroupBox также создаютса...

14
фрилансер
 Аватар для Алексей1153
6449 / 5644 / 1129
Регистрация: 11.10.2019
Сообщений: 15,019
26.03.2021, 11:33
NewEmbedder, это зависит от логики их (объектов) взаимодействия.

если автоматизировать процесс при помощи умных указателей, то порядок будет сам по себе правильный
0
6 / 6 / 0
Регистрация: 23.03.2021
Сообщений: 74
26.03.2021, 12:14  [ТС]
Алексей1153, спасибо! Похоже, порядок в очередности все же должен быть.
Логика примерно такая. Внутри объекта верхнего уровня (их много и они разные) создаются объекты нижнего, причем порядок создания последних произвольный, а некоторые из нижних могут создаваться или нет. Объект верхнего уровня при необходимости разрушается диструктором, при этом нужно за собой уничтожить все объекты, что создавалось для нижнего уровня.
Умные указатели, что они из себя представляют и как примерно мог бы работать механизм автоматизации?
0
фрилансер
 Аватар для Алексей1153
6449 / 5644 / 1129
Регистрация: 11.10.2019
Сообщений: 15,019
26.03.2021, 12:21
NewEmbedder, больше напоминает вложенные списки, так что, наверное, можно и без указателей обойтись. Нужны детали - пока что непонятно, что и где

я сейчас понимаю происходящее так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct DOWNLEVEL
{
};
 
struct UPPERLEVEL
{
     std::vector<DOWNLEVEL> list;
};
 
int main()
{
    std::vector<UPPERLEVEL> ul_list;
}
Добавлено через 52 секунды
все объекты уничтожатся сами в нужном порядке
0
6 / 6 / 0
Регистрация: 23.03.2021
Сообщений: 74
26.03.2021, 12:32  [ТС]
Алексей1153, Вы правы, есть и списки, там все реализуется само собой. Но есть и графические примитивы (здесь применяется Qt3), где одни примитивы встраиваются в другие.
Я понял Вашу идею с умными указателями. Остался вопрос с прямым и обратным порядком создания и уничтожения внутренних объектов, на сколько важно это требование, и есть ли ссылка на регламент.
0
фрилансер
 Аватар для Алексей1153
6449 / 5644 / 1129
Регистрация: 11.10.2019
Сообщений: 15,019
26.03.2021, 12:35
NewEmbedder, в Qt:
объекты, производные от QObject, в конструктор могут получать указатель на владеющий ими объект (или позже - через setParent). Владельцы сами удалят свои объекты. А если объект удаляется по другой причине, владелец удалит его из своих списков

все остальные объекты - работают "согласно обычным правилам C++"

Покажи пример, с чем именно возник вопрос?
0
6 / 6 / 0
Регистрация: 23.03.2021
Сообщений: 74
26.03.2021, 13:10  [ТС]
Пример показать не могу, проект доставшийся в наследство имеет более сотни файлов. Работает в разных городах на некотором числе рабочих мест под FreeBSD, на одном из которых был вылетел из программы. Было подозрение на диструкторы, и пока оно остается.
За советы спасибо.
0
фрилансер
 Аватар для Алексей1153
6449 / 5644 / 1129
Регистрация: 11.10.2019
Сообщений: 15,019
26.03.2021, 13:15
NewEmbedder, так проект и не надо. Минимальный примерчик, где показана нужная архитектура
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.03.2021, 19:31
Цитата Сообщение от NewEmbedder Посмотреть сообщение
Вопрос такой, требуется ли в диструкторе уничтожать объекты в порядке обратном по отношению к тому порядку, что был в конструкторе и насколько это важно?
реализация конкретного деструктора зависит от бизнес-логики конкретного класса.
в общем случае логично и правильно освобождать ресурсы в порядке,
обратном относительно их захвата.

обрати внимание: речь идет о захвате/особождении ресурсов.
а не о создании/уничтожении объектов.

говорить об уничтожении объектов не вполне корректно.
потому что не очевидно, о каких таких объектах идет речь.

так например, данные-членны класса тоже являтся объектами.
но при этом деструктор легальным способом никак не сможет их уничтожить.
данные-члены уничтожаются автоматически сами, по факту завершения работы деструктора.
причем всегда строго в порядке, обратном их созданию.
порядок создания определяется порядком объявления этих данных-членов в декларации класса,
и никак не зависит от реализации конструктора.
0
6 / 6 / 0
Регистрация: 23.03.2021
Сообщений: 74
27.03.2021, 20:28  [ТС]
hoggy, спасибо за разъяснения. Я понимаю так, что порядок создания или выделения памяти для данных-членов класса всегда соответствует порядку их объявления (декларирования) в заголовочном файле, и нам нельзя вмешаться в этот порядок как при создании объекта класса, так и при его уничтожении. Но мы все же можем в произвольном порядке создавать другие объекты внутри класса командой new, где для каждого из них есть только указатель, что будет храниться в одном из данных-членов. А уничтожаются объекты командой delete в диструкторе, и если один из объектов не был создан, то и не нужно выполнять соответствующую ему команду delete. Вопрос мой касался именно порядка создания и уничтожения этих объектов внутри класса. Похоже, что этот порядок не принципиален, главное не допустить уничтожение тех объектов в классе, что не были созданы, и как это технически сделать мне стало уже понятно. У меня подозрения, что вылеты программы могли были из-за этого.
Попутно возник еще вопрос, обычно другие объекты внутри класса создаются в конструкторе, но их наверное можно создавать не только в нем, а и в других местах. Главное, что бы потом не было коллизий в диструкторе.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.03.2021, 20:54
Цитата Сообщение от NewEmbedder Посмотреть сообщение
Похоже, что этот порядок не принципиален
код, который подчиняется строгим правилам всегда проще,
чем код, в котором царит бардак.

по этой причине, есть смысл относиться к тезису, как к принципиальному:
Цитата Сообщение от hoggy Посмотреть сообщение
в общем случае логично и правильно освобождать ресурсы в порядке,
обратном относительно их захвата.
Цитата Сообщение от NewEmbedder Посмотреть сообщение
но их наверное можно создавать не только в нем, а и в других местах
есть такой анти-паттерн, называется "отложенная инициализация".

суть паттерна в том, что конструктор инициализирует лишь неккий минимум.
настоящая же подготовка объекта к работе выполняется в отдельных методах,
которые называют prepare, statup, init, start,
или ещё каким то подобным образом.

пример:

C++
1
2
3
sample object;
object.prepare(data); // <--- подготовка к работе
object.run(); // <--- запуск
ну так вот, данный анти-паттерн является антипаттерном потому,
что создаёт множество досадных проблем,
которых бы не возникло,
если бы конструктор изначально использовался бы по назначению.

например, в примере выше, метод run должен учитывать,
что его могут запустить без предварительной подготовки:

C++
1
2
3
sample object;
// object.prepare(data); // <--- ничайно забыли подготовить объект к работе
object.run(); // <--- запуск
и вот что делать в таком случае?
нужно будет в классе хранить какую то дополнительную переменную,
что бы отмечать: была уже подготовка или нет.
и в каждом методе проверять этот флажок.
и если подготовки не было - то каким то образом поднимать тревогу.
а как её поднимать? assert или exception, или как то ещё?

на ровном месте возникли инженерные проблемы,
которые теперь придется преодолевать.

а вот если изначально использовать конструктор по назначению,
то всех этих проблем не возникнет в принципе:

C++
1
2
3
4
5
// <-- уже никак не получится ничайно забыть подготовить объект
sample object(data); 
 
// <--- гарантируется, что объект уже подготовлен к работе
object.run();
и не нужны никакие флажки.
и код в разы проще и надёжнее.

Цитата Сообщение от NewEmbedder Посмотреть сообщение
Главное, что бы потом не было коллизий в диструкторе.
если ты решишь заюзать антипаттерн, что я выше описал,
тогда коллизии в деструктре станут меньшими из твоих проблем.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.03.2021, 21:28
Цитата Сообщение от NewEmbedder Посмотреть сообщение
Но мы все же можем в произвольном порядке создавать другие объекты внутри класса командой new, где для каждого из них есть только указатель, что будет храниться в одном из данных-членов.
NewEmbedder, выделение ресурсов объекта и их инициализация, это сложный вопрос. Строго говоря, указатель - поле класса, это то что объект захватывает как свою неотделимую собственность. А вот память по указателю может выделяться и инициализироваться когда угодно. Ссылки такой свободы не предусматривают и являются также неотделимой собственностью объекта, но уже вместе с целевым ресурсом. Это самодельная терминология, для облегчения понимания мысли.
Но возвращаясь к указателям, я бы сказал, что:
Цитата Сообщение от NewEmbedder Посмотреть сообщение
мы все же можем в произвольном порядке создавать другие объекты внутри класса командой new, где для каждого из них есть только указатель, что будет храниться в одном из данных-членов.
это не верно. Внутри класса создаются указатели, а их ресурсы навешиваются снаружи (см. опус о неотделимой/отделимой собственности). Но если даже вы решите идти по пути захвата таких ресурсов в порядке зависящем от внешней логики (не задавая жестко в правилах описанных конструкторами), вы должны понимать, что вы требуете от программы понимания внутренней логики вашего класса и её соблюдения. В С++ убивают за гораздо меньшие злодейства. Но свобода - пуще неволи. Ни кто не в силах вам помешать. (Нечаянно опечатлся набирая пословицу и вышло: Но свобода - пpуще неволи. По смыслу тоже подходит). Собственно, hoggy, об этом говорит. Хотя, если продумать ленивые вычисления, то они могут быть полезны. Но это должно быть обоснованно и требует серьёзных усилий. Чревато к тому же.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
27.03.2021, 21:36
Цитата Сообщение от NewEmbedder Посмотреть сообщение
Вопрос такой, требуется ли в диструкторе уничтожать объекты в порядке обратном по отношению к тому порядку, что был в конструкторе
Не требуется.

Цитата Сообщение от NewEmbedder Посмотреть сообщение
и насколько это важно?
1. "Насколько это важно" в вашем коде известно только вам. Если в вашем коде порядок удаления не играет роли, то используйте удаление в обратном порядке просто как логичное соглашение.

2. Вы вообще не должны в обычных случаях заниматься ручным удалением объектов. За удаление динамических объектов должны отвечать умные указатели. А там уж сам собой получится обратный порядок.
0
6 / 6 / 0
Регистрация: 23.03.2021
Сообщений: 74
27.03.2021, 22:54  [ТС]
Я понял все ваши советы.
Спасибо за квалифицированные разъяснения, вы мне помогли.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.03.2021, 23:26
Цитата Сообщение от NewEmbedder Посмотреть сообщение
Я понял все ваши советы.
Завидую, если честно. Нужно время чтобы понять. NewEmbedder, произвольный порядок инициализации, это наверное, не то, что имеет смысл и возможно, вы имели ввиду, что-то другое. Конструирование объекта как механизм инициализации уравнивает пользовательские типы с примитивными типами С *(что было задекларировано автором языка). Там не предусматривается какой-либо, частичной инициализации. Хотя бы потому, что рождённый объект в случае возможной не завершенности инициализации, будет вынужден постоянно проверять какие-то флаги или значения указателей на предмет равенства nullptr. Однако, если объекты класса чувствительны к окружению на уровне взрывоопасности, а логика зависит от многих (в т.ч. платформенно-зависимых) вещей, проверка которых может надолго связывать какие-то ресурсы, или боже упаси породить исключение, когда объект не может быть создан или ещё что..., то конструктора просто закрывают, а объекты создают в скоупе фабричных, дружественных методов или классов. Там выясняется как будет инициализироваться объект и будет ли он вообще создаваться. То есть, несмотря на расширение возможных вариантов хода инициализации, никто не отдаёт программе, свободу решать эти вопросы. Создаётся некое окружение ответственное за процесс.
Но конструкторы должны быть простыми и надёжными (по возможности), если они публикуются в открытой части класса.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.03.2021, 23:26
Помогаю со студенческими работами здесь

Понятие принципа создания динамических объектов
Например я написал такой код: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class Box { ...

Jaxb порядок создания объектов
Всем привет. В таком примере: &lt;root&gt; &lt;a&gt;&lt;/a&gt; &lt;b&gt;&lt;/b&gt; &lt;a&gt;&lt;/a&gt; &lt;b&gt;&lt;/b&gt; ...

Изменить порядок создания объектов в AutoCAD
Добрый день! Помогите, пожалуйста, решить задачу изменения порядка создания объектов в AutoCAD. Суть в следующем: имеется чертеж AutoCAD...

Использование динамических объектов с использованием других динамических объектов
Есть 2 массива, один создаёт Combobox, второй - Memo. Они создаются в количестве связаное с количеством записей в Базе Данных. Мне нужно...

Демонстрационная программа создания и уничтожения процессов
Помогите пожалуйста как можно исправить программу Приложение 2 //демонстрационная программа создания и уничтожения процессов //тип...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru