|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|||||||||||
Дин. выделение памяти, конструкторы/деструкторы12.11.2011, 00:54. Показов 3500. Ответов 28
Метки нет (Все метки)
Хотел бы уточнить.
1) Чем отличается это:
Про то, что первое будет находится в стэке, а второе в куче я знаю. А какие другие различия? Да и что выигрывает? Стэк или куча? Думаю, что стэк, но уточнить стоит. 2) При вызове деструктора уничтожаются все не статические объекты класса? Я говорю про int value, char name[ 50 ], std::string и т.д. Про то, что динамически выделенную память надо освобождать самому я знаю. Даже если деструктор вызвать в ручную? 3) При вызове конструктора создаются все не статические объекты класса? Даже если вызвать конструктор в ручную?
0
|
|||||||||||
| 12.11.2011, 00:54 | |
|
Ответы с готовыми решениями:
28
Конструкторы и деструкторы Конструкторы и деструкторы |
|
Каратель
|
|||||
| 12.11.2011, 01:12 | |||||
|
1
|
|||||
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
| 12.11.2011, 01:15 [ТС] | |
|
Почему можно вызвать сколько угодно раз подряд деструктор/конструктор?
0
|
|
|
32 / 32 / 8
Регистрация: 07.10.2011
Сообщений: 117
|
|
| 12.11.2011, 01:23 | |
|
Постараюсь ответить на 1й вопрос:
2й вариант кода, это создаётся указатель на переменную int.Если не ошибаюсь, то стек работает быстрее кучи. 2й вариант, это уже динамическое выделение памяти , её в основном , используют при создании динамических массивов (Их размерность может меняться ),или для извлечения адреса(отладка, дизассемблирование и так далее), или при передаче параметров функции(например, указатель на массив) .По идее, 1й код должен быстрее работать, так как разница в скорости возникает в то время, когда нужно занять/освободить место в памяти. Стек всегда готов к размещению новых данных и всегда готов у удалению данных. А кучей по сути является свободное пространство в памяти и для того чтоб разместить в ней данные, нужно обратиться к менеджеру памяти, менеджер памяти найдет свободное место нужного размера в памяти, зарегистрирует его как занятый и вернет адрес этого блока в программу. При удалении блока данных из кучи так же нужно обратиться к менеджеру памяти, менеджер памяти пометит данный кусок памяти как свободный. А так указателями редко пользуюсь при написании простых программ.Хотя может ещё какое применение у них
1
|
|
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|||||
| 12.11.2011, 01:41 [ТС] | |||||
|
0
|
|||||
|
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
|
|||
| 12.11.2011, 02:58 | |||
|
1
|
|||
|
Заблокирован
|
||
| 12.11.2011, 03:02 | ||
|
Что значит последовательный/произвольный доступ к памяти? Я на стеке сделал парочку переменных, и обращаюсь к любой из них в любой момент. Это что, дольше, чем если бы они жили в куче?
1
|
||
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||
| 12.11.2011, 03:04 | ||
|
это очевидно из архитектуры там мендежера нет - там управлять то почти нечем
1
|
||
|
Заблокирован
|
||
| 12.11.2011, 21:35 | ||
|
В вашем примере. когда целочисленная переменная определяется в стеке, то компилятор не вызывает оператор-функцию delete. Ей просто делать нечего. Компилятор просто выравнивает стек до вызова в функцию main. То есть во втором случае с кучей мы получаем дополнительные издержки по вызову оператор-функции. Кроме того даже при инициализации объекта в кучи функции new нужно передать аргумент, который в вашем случае равен нулю. Это еще дополнительные издержки, то есть издержки по передачи аргументов в функцию. Когда же переменная создается в стеке, то компилятор просто "вшивает" инструкцию инициализации в код. Отвечая на второй вопрос, замечу, что деструкторы имеются только у пользовательских типов. К фундаментальным типам деструкторы никакого отношения не имеют. Если вы имеет класс, в которым определены поля в виде фундаментальных типов, то из памяти удаляется один непрерывный участок, который был выделен для объекта. Что касается третьего вопроса, то конструктор вызывает сначала конструкторы базовых классов, если такие имеются, а затем конструкторы членов класса, если они также имеют свои конструкторы. Вызываются конструкторы в порядке их определения за исключением виртуальных базовых классов.
1
|
||
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
| 12.11.2011, 21:56 [ТС] | |
|
А как насчет вызова конструкторов\деструкторов несколько раз подряд? Почему это работает?
0
|
|
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|||||||
| 12.11.2011, 22:49 [ТС] | |||||||
0
|
|||||||
|
Заблокирован
|
||
| 12.11.2011, 22:52 | ||
|
1
|
||
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
||
| 12.11.2011, 22:55 [ТС] | ||
|
Если так, то почему можно много раз занимать память для встроенного типа и много раз освобождать память?
0
|
||
|
Заблокирован
|
||
| 12.11.2011, 23:08 | ||
|
Вот что у тебя написано в теле самого метода - то и выполнится при разрушении объекта. Если там написано, что надо память освободить - то она освободится. Если не написано - не освободится. объекты созданные на стеке разрушаются не потому, что у их хозяина сработал диструктор, а потому, что сам хозяин был разрушен. Если ты явно запустишь диструктор хозяину, то он "почистится". Но сам хозяин разрушен не будит. А вот если он выйдет из области видимости, или будит явно удален при помощи delete, только тогда он будит разрушен. И соответственно, будут разрушены все его данные-члены, живущие в стеке.
1
|
||
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
| 13.11.2011, 15:21 | |
|
0
|
|
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
||
| 13.11.2011, 16:04 [ТС] | ||
|
0
|
||
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
| 13.11.2011, 16:19 | |
|
Chelioss, а в чем вы компилировали?
http://codepad.org/BiKxPyhn Добавлено через 1 минуту те правильно f.~Foo(); но не то что вы написали, про конструкторы так совсем
0
|
|
|
Заблокирован
|
|
| 13.11.2011, 16:32 | |
|
http://liveworkspace.org/code/... 34fd85d698
А vs2010 компилирует, странно... Порылся в стандарте и нигде не нашёл, что так можно или нельзя делать. В главе 12.6.1 Explicit initialization ничего подобного нет, а где ещё про это мб написано, поэтому смею предположить что это баг студии
0
|
|
| 13.11.2011, 16:32 | |
|
Помогаю со студенческими работами здесь
20
Конструкторы и деструкторы Конструкторы и деструкторы Конструкторы и деструкторы Конструкторы и деструкторы Конструкторы и деструкторы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению.
На форме документа создается. . .
|
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|
|
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
|
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию.
2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
|
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
|
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO
Апнулись до NET10.
Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта
так и в интерактивном режиме. из сложностей - чисто функциональный подход.
Решил. . .
|