![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| yull |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 20.11.2011 Репутация: нет Всего: нет |
Объясните пожалуйста,почему деструктор не передает параметры?
И второй вопрос: почему не может быть два деструктора? |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
по стандарту. да и как выбирать, какой деструктор выбрать при delete obj; ? Добавлено через 3 минуты и 16 секунд тока щаз понял - куда не передаёт ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| hawk3500 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 246 Регистрация: 6.2.2009 Репутация: нет Всего: 2 |
Деструктор должен вернуть системе область памяти, выделенную при выполнении конструктора.
По этому на входе ему никакие аргументы не требуются не нужны. Деструктор нельзя объявлять как принимающий аргументы. Класс может иметь сколько угодно конструкторов (с разными наборами параметров), в том числе шаблонных, и только один) деструктор. По сути можно сказать что деструктор есть не что иное как операция free. Конструктор и деструктор являются функциями только с точки зрения их синтаксического описания. Конструктор нельзя вызвать в любом месте, он всегда вызывается только в момент создания объекта. Деструкторы тоже не совсем таак сказать функции, но их можно вызвать в любом произвольном месте. Но есть несколько моментов которые надо учитывать: 1)конструктор выделяет область памяти под переменные класса(а не под функции-т.е. для всех классов одного и тогоже типа функии одни и теже и находятся по одному и томуже адресу). 2)при создании и инициализации указателя на класс можно и нужно пользоваться функцией delete .Исключение состовляет лишь такой случай:
3)код деструктора реально отрабатывает раньше функции free (class) --------------------
воин dzen'a |
|||
|
||||
| yull |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 20.11.2011 Репутация: нет Всего: нет |
Спасибо, вы мне очень помогли) |
||||
|
|||||
| Леопольд |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Деструктор нужен для того что-бы освободить ресурсы, если есть. Если предполагается удалять объект по указатель или ссылке на базовый класс, тогда деструктор должен быть виртуальным, иначе деструкторы наследников не будут вызваны - неопределённое поведение.
Конструктор не выделяет память, он её инициализирует, для этого у него есть одна особенность, которой нет у других функций - список инициализации. Выглядит вот так:
И конструкторы и деструкторы можно вызвать в любом месте, но двойной вызов конструктора или деструктора на один и тот же адрес памяти - неопределённое поведение. Т.е. так делать нельзя:
Есть определённый порядок вызова конструктора/деструктора для агрегированных типов и базовых классов. Конструктор вызывается сначала для базовых классов, если есть, потом для агрегированных типов в порядке их определения в классе (но не в списке инициализации), потом для самого класса. Порядок вызова деструктора полностью противоположен. Это сообщение отредактировал(а) Леопольд - 26.11.2011, 09:57 -------------------- вопросов больше чем ответов |
||||
|
|||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
Автоматический вызов деструктора - одна из важнейших особенностей C++.
Если программисту приходится участвовать в этом процессе, передавая параметры или выбирая один из двух вариантов, то этот процесс становится гораздо менее автоматическим. -------------------- qqq |
|||
|
||||
| hawk3500 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 246 Регистрация: 6.2.2009 Репутация: нет Всего: 2 |
Т.е. как это не выделяет? А кто тогда выделяет?? При создании объекта и вызове конструктора выделяется память. А вызов конструктора без создания объекта не возможен. --------------------
воин dzen'a |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Память выделяется до того как будет вызван конструктор.
Память может быть выделена в статической области данных процесса - объект "живёт" до тех пор, пока жив процесс. На стеке - память автоматически выделяется и освобождается на стеке процесса (при вызове функций, например) В куче - память выделяется программистом вручную, обычно при помощи оператора new. Освобождается тоже вручную, обычно при помощи оператора delete. Процесс освобождения желательно автоматизировать при помощи умных указателей. Это сообщение отредактировал(а) Леопольд - 25.11.2011, 20:30 -------------------- вопросов больше чем ответов |
|||
|
||||
| hawk3500 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 246 Регистрация: 6.2.2009 Репутация: нет Всего: 2 |
Ага, понял о чём вы.
--------------------
воин dzen'a |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: нет Всего: 88 |
вроде это не обязано быть так во всех реализациях -------------------- Обижено школьников: 8 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
смотрите размещающий new, который может создать объект в любой заранее выделенной памяти.. |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
компилятор подсчитывает размер класса эквивалентно сипользованию sizeof(). полученное значение передается оператору new, результат которого, используется по аналогии с placement new. т.е. такой вот "стенд" получился:
http://liveworkspace.org/code/444383e6535a...3662995399a6cd1 вывод:
обрати внимание на то, что delete применять к p1 нельзя из-за того, что он пытается вернуть выделенную память куче, в то время, как она на самом деле была выделена на стеке. а так же на то, что деструктор не затирает память, как иногда встречаются заблуждения. Это сообщение отредактировал(а) boostcoder - 26.11.2011, 10:09 |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |