|
6 / 6 / 0
Регистрация: 23.03.2021
Сообщений: 74
|
|
Порядок создания и уничтожения динамических объектов в классе26.03.2021, 11:07. Показов 1673. Ответов 14
Метки нет (Все метки)
Программирую на С++, создавая динамические объекты на электронной карте.
Вопрос связан с созданием к конструкторе класса новых динамических объектов, а также их уничтожением в диструкторе этого же класса. Вопрос такой, требуется ли в диструкторе уничтожать объекты в порядке обратном по отношению к тому порядку, что был в конструкторе и насколько это важно?
0
|
|
| 26.03.2021, 11:07 | |
|
Ответы с готовыми решениями:
14
Анимации создания и уничтожения объектов
Создания динамических объектов |
|
фрилансер
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
|
|
|
фрилансер
6449 / 5644 / 1129
Регистрация: 11.10.2019
Сообщений: 15,019
|
||||||
| 26.03.2021, 12:21 | ||||||
|
NewEmbedder, больше напоминает вложенные списки, так что, наверное, можно и без указателей обойтись. Нужны детали - пока что непонятно, что и где
я сейчас понимаю происходящее так
все объекты уничтожатся сами в нужном порядке
0
|
||||||
|
6 / 6 / 0
Регистрация: 23.03.2021
Сообщений: 74
|
|
| 26.03.2021, 12:32 [ТС] | |
|
Алексей1153, Вы правы, есть и списки, там все реализуется само собой. Но есть и графические примитивы (здесь применяется Qt3), где одни примитивы встраиваются в другие.
Я понял Вашу идею с умными указателями. Остался вопрос с прямым и обратным порядком создания и уничтожения внутренних объектов, на сколько важно это требование, и есть ли ссылка на регламент.
0
|
|
|
фрилансер
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
|
|
|
фрилансер
6449 / 5644 / 1129
Регистрация: 11.10.2019
Сообщений: 15,019
|
|
| 26.03.2021, 13:15 | |
|
NewEmbedder, так проект и не надо. Минимальный примерчик, где показана нужная архитектура
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 26.03.2021, 19:31 | ||
|
в общем случае логично и правильно освобождать ресурсы в порядке, обратном относительно их захвата. обрати внимание: речь идет о захвате/особождении ресурсов. а не о создании/уничтожении объектов. говорить об уничтожении объектов не вполне корректно. потому что не очевидно, о каких таких объектах идет речь. так например, данные-членны класса тоже являтся объектами. но при этом деструктор легальным способом никак не сможет их уничтожить. данные-члены уничтожаются автоматически сами, по факту завершения работы деструктора. причем всегда строго в порядке, обратном их созданию. порядок создания определяется порядком объявления этих данных-членов в декларации класса, и никак не зависит от реализации конструктора.
0
|
||
|
6 / 6 / 0
Регистрация: 23.03.2021
Сообщений: 74
|
|
| 27.03.2021, 20:28 [ТС] | |
|
hoggy, спасибо за разъяснения. Я понимаю так, что порядок создания или выделения памяти для данных-членов класса всегда соответствует порядку их объявления (декларирования) в заголовочном файле, и нам нельзя вмешаться в этот порядок как при создании объекта класса, так и при его уничтожении. Но мы все же можем в произвольном порядке создавать другие объекты внутри класса командой new, где для каждого из них есть только указатель, что будет храниться в одном из данных-членов. А уничтожаются объекты командой delete в диструкторе, и если один из объектов не был создан, то и не нужно выполнять соответствующую ему команду delete. Вопрос мой касался именно порядка создания и уничтожения этих объектов внутри класса. Похоже, что этот порядок не принципиален, главное не допустить уничтожение тех объектов в классе, что не были созданы, и как это технически сделать мне стало уже понятно. У меня подозрения, что вылеты программы могли были из-за этого.
Попутно возник еще вопрос, обычно другие объекты внутри класса создаются в конструкторе, но их наверное можно создавать не только в нем, а и в других местах. Главное, что бы потом не было коллизий в диструкторе.
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||||||
| 27.03.2021, 20:54 | ||||||||||||||||||||
|
чем код, в котором царит бардак. по этой причине, есть смысл относиться к тезису, как к принципиальному: суть паттерна в том, что конструктор инициализирует лишь неккий минимум. настоящая же подготовка объекта к работе выполняется в отдельных методах, которые называют prepare, statup, init, start, или ещё каким то подобным образом. пример:
что создаёт множество досадных проблем, которых бы не возникло, если бы конструктор изначально использовался бы по назначению. например, в примере выше, метод run должен учитывать, что его могут запустить без предварительной подготовки:
нужно будет в классе хранить какую то дополнительную переменную, что бы отмечать: была уже подготовка или нет. и в каждом методе проверять этот флажок. и если подготовки не было - то каким то образом поднимать тревогу. а как её поднимать? assert или exception, или как то ещё? на ровном месте возникли инженерные проблемы, которые теперь придется преодолевать. а вот если изначально использовать конструктор по назначению, то всех этих проблем не возникнет в принципе:
и код в разы проще и надёжнее. тогда коллизии в деструктре станут меньшими из твоих проблем.
1
|
||||||||||||||||||||
|
Комп_Оратор)
|
|||
| 27.03.2021, 21:28 | |||
|
Но возвращаясь к указателям, я бы сказал, что:
0
|
|||
|
Вездепух
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
|
|||
| 27.03.2021, 21:36 | |||
|
2. Вы вообще не должны в обычных случаях заниматься ручным удалением объектов. За удаление динамических объектов должны отвечать умные указатели. А там уж сам собой получится обратный порядок.
0
|
|||
|
6 / 6 / 0
Регистрация: 23.03.2021
Сообщений: 74
|
|
| 27.03.2021, 22:54 [ТС] | |
|
Я понял все ваши советы.
Спасибо за квалифицированные разъяснения, вы мне помогли.
0
|
|
|
Комп_Оратор)
|
||
| 27.03.2021, 23:26 | ||
nullptr. Однако, если объекты класса чувствительны к окружению на уровне взрывоопасности, а логика зависит от многих (в т.ч. платформенно-зависимых) вещей, проверка которых может надолго связывать какие-то ресурсы, или боже упаси породить исключение, когда объект не может быть создан или ещё что..., то конструктора просто закрывают, а объекты создают в скоупе фабричных, дружественных методов или классов. Там выясняется как будет инициализироваться объект и будет ли он вообще создаваться. То есть, несмотря на расширение возможных вариантов хода инициализации, никто не отдаёт программе, свободу решать эти вопросы. Создаётся некое окружение ответственное за процесс. Но конструкторы должны быть простыми и надёжными (по возможности), если они публикуются в открытой части класса.
0
|
||
| 27.03.2021, 23:26 | |
|
Помогаю со студенческими работами здесь
15
Понятие принципа создания динамических объектов Jaxb порядок создания объектов Изменить порядок создания объектов в AutoCAD Использование динамических объектов с использованием других динамических объектов Демонстрационная программа создания и уничтожения процессов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель микоризы: классовый агентный подход 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?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|