|
5 / 5 / 2
Регистрация: 21.07.2016
Сообщений: 34
|
||||||
Стек или куча: как "правильно" создавать объекты классов?18.02.2017, 05:00. Показов 28617. Ответов 27
Метки нет (Все метки)
У меня несколько странновато-ламерский вопрос, но ведь в том и смысл: чтобы таких вопросов не осталось, на них один фиг сначала нужно где-то получить ответы.
Когда нужно создавать объекты через указатель, а когда - статично? Я по возможности хочу придерживаться одного стиля, но вот проблема - не знаю какого ![]()
А если мне эти объекты нужно передавать в качестве аргументов функции, то для второго случая я просто использую передачу по ссылке. Уменьшу себе кол-во стрелочек и звездочек (а заодно и кол-во выстрелов себе в ногу из-за потенциальных проблем с указателями). Получается, что статичная инициализация даже предпочтительнее? Тогда почему именно указатели вижу чаще в коде других людей? Очевидно, я чего-то не знаю, вот и интересно, что именно.Знаю, что в первом случае для осовобождения памяти применяется delete (ну, по-хорошему). Получается, что для второго случая освобождать память не требуется? Всё потому, что она Также я знаю, что динамическое создание объектов применяется если размер объекта неизвестен. Правда тут во всех примерах упоминают только массивы, и с ними мне как раз всё понятно. Но подобное про класс я ничего нигде не видел. И даже если внутри класса будут те же динамические массивы, почему я все равно могу использовать вторую запись? Может быть вся "проблема" в этой самой статичной памяти? Перефразируя свой первый вопрос, задам последний вопрос: где, в смысле в какой памяти, предпочтительнее размещать объекты в своих программах, и почему? Заранее спасибо всем отвечающим. Знаю, вопросы ламерские. И я честно читал умные книжки и статейки, про память, про классы... Но надеюсь вам не составит труда дать исчерпывающие ответы.
0
|
||||||
| 18.02.2017, 05:00 | |
|
Ответы с готовыми решениями:
27
Как правильно создавать объекты ? Как правильно создавать объекты ? Как правильно создавать объекты на форме? |
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
|
| 18.02.2017, 12:12 | |
|
Renji, В общем-то я с вами согласен. Вот у меня есть такая привычка. Все диалоги (модальные) создаю в стеке. Ибо их жизнь ограничивается телом метода, в котором они вызваны. Поговорил - и хватит. Но все их подвиджетики, конечно, в куче. И все остальное, чья жизнь зависит от каприза пользователя, тоже туда же.
1
|
|
|
187 / 54 / 19
Регистрация: 23.12.2016
Сообщений: 167
|
|
| 18.02.2017, 12:21 | |
|
Статичные объекты создаются статично, динамичные - через вызов new. Т.е. если объект не изменяется во время рантайма, то можно и просто объявить экземпляр объекта. Если же объект класса изменяется - т.е. удаляется и вместо него генерируется другой объект того же класса - то через new и указатель. Это общее правило, которому я обычно следую.
Но есть нюансы. Иногда в другие классы нужно передать указатель на другие классы - это если они тесно взаимодействуют. Это гораздо проще сделать, если объявлять объекты динамически - мы сразу имеем указатель на объект без лишних телодвижений. Паттерн "Фабричный метод", который применяется почти везде - только через указатели работает. Ну и т.д. Да и вообще Computer Science движется в сторону указателей. В Java всё работает по сути через указатели, интерфейс только чуть другой чем в С++. Хотя если создается много объектов одного класса - это проще решить через массив объектов, чем через массив указателей - меньше кода писать. Это всё сугубо мое мнение.
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 18.02.2017, 14:24 | ||
|
1
|
||
|
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 313
|
||
| 18.02.2017, 14:28 | ||
|
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||||||
| 18.02.2017, 14:54 | |||||||
1
|
|||||||
|
Неэпический
|
|||
| 18.02.2017, 16:45 | |||
Сообщение было отмечено gru74ik как решение
Решениевременного объекта с помощью указателя. Когда получится, напишите нам об этом. ![]() Будем считать, что объект начинает жизнь тогда, когда под него выделилась память и завершилась его инициализация. Всякие отводы, тонкости и заковыки рассматривать не будем. Объект умирает, когда память им занимаемая была освобождена или деструктор (если он есть и не тривиальный) объекта был вызван. Итак, для начала рассмотрим коротенько четыре "времени хранения" (storage duration). Статическое время хранения (static storage duration) - всё статическое живет от момента создания до самого конца программы. Потоковое время хранения (thread storage duration) - всё потоковое живет от момента создания до конца потока в котором создано. Автоматическое время хранения (automatic storage duration) - всё автоматическое живет от момента создания до конца блока в котором оно было создано. Динамическое время хранения (dynamic storage duration) - всё динамическое живет от момента создания до того момента, пока его явно не прихлопнут. Соответственно уже отсюда можно сделать вывод что нам необходимо. A. Если объект должен жить всю программу (ну, почти), то варианта два: 1) Использовать объект с потоковым временем хранения, ежели у нас имеется один, живущий всю программу поток. 2) Использовать объект с статическим временем хранения. 0) Еще вариант, использовать динамический объект, но для его корректного уничтожения придется либо в какой-то из функций его явно уничтожить, что как бы уже подразумевает, что объект живет меньше чем статические объекты, либо же в деструкторе одного из статических объектов уничтожить и наш динамический объект, только вот получается, что нам для этого нужен статический объект, так что такой вариант не рассматриваем. Вариант не уничтожать его совсем - система прихлопнет память, рассматривать не будем, т.к. для объектов не будет вызван деструктор, а мы рассматриваем общее для всех объектов, а не отдельных их "видов". Так что для "чистоты эксперимента" подобные варианты мы не рассматриваем. Также выбросим из повествования временные объекты. B. С потоковыми объектами, практически также, как и со статическими, только в масштабах потока, так что расписывать не буду, ибо и так ясно. C. Если нам нужен объект, который должен быть уничтожен после выхода из блока, в котором создался, то варианта два: 1) Использовать автоматический объект. 2) Использовать динамический объект, но при этом придется вручную его создавать и уничтожать. D. Если нам необходимо, чтобы объект, созданный в блоке жил до самого конца программы (или потока),то вариант у нас один: 1) Сделать его статическим объектом, ну или потоковым, если речь о потоке. 0) С динамическим объектом та же фигня, что и в прошлый раз - до конца такое не доживет, либо уничтожится не правильно (в общем случае). E. Если нам необходимо, чтобы объект жил после выхода из блока в котором создан, но мы не знаем до какого времени он нам понадобится и, жить ему всю программу не нужно, то здесь вариант тоже один: 1) Динамический объект. Теперь по каждому пункту отдельно. A. Потоковый или статический? А смотрим на программу. У нас планируется всего один поток? Если да, то нефиг пытать потоковый класс памяти. Если же потоков может быть несколько, то у каждого потока должна быть своя такая переменная? Если да, то потоковый берем, если нет - статический. B. см. предыдущий пункт. C. Автоматический или динамический? Объекты маленькие, их количество известно и они точно влезут в стек (без фанатизма)? Если да то использовать автоматические объекты или динамические зависит от хотелок разработчика и здравого смысла. Если не нужна динамика, то нафиг заниматься ручной работой? Но если очень хочется, то можно хоть каждый int делать динамическим. Если же объекты тяжелые и не хочется на них тратить стек, или же нам неизвестно конечное количество одновременно живущих элементов, то тут только динамические объекты прокатят. Вариант "создам здоровый массив на все случаи жизни" здесь не прокатит, т.к. выше оговорено, что конечное количество одновременно живущих объектов неизвестно и, соответственно, оно всегда будет равно sizeof(mySuperArray)/sizeof(*mySuperArray) + 1.D. Всё как и прежде - смотрим на потребности в каждом потоке. E. Без вариантов. В программах, чаще всего, встречается смесь из всего высказанного выше в разных пропорциях и сочетаниях. Вот такая абсолютно бесполезная портянка, т.к. она всё равно не покрывает всего и вся и не является истиной в последней инстанции.
9
|
|||
|
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 313
|
|||
| 18.02.2017, 16:53 | |||
![]() Добавлено через 45 секунд
0
|
|||
|
Неэпический
|
|||||
| 18.02.2017, 16:58 | |||||
|
правда тут явное несоответствие в вопросе. Добавлено через 1 минуту Ну, собственно, давно уже планируется, увы, но времени нет на такую писанину.
1
|
|||||
| 18.02.2017, 16:58 | |
|
Где создавать объекты классов? Возможно ли создавать объекты для абстрактных классов? Написать демонстрационную программу, в которой создаются объекты различных классов и помещаются в список. И еще куча лабораторных Считается ли хорошим тоном создавать объекты классов в области глобальных переменных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|