| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > вопрос про деструкторы! |
| Автор: yull 24.11.2011, 20:55 |
| Объясните пожалуйста,почему деструктор не передает параметры? И второй вопрос: почему не может быть два деструктора? |
| Автор: borisbn 24.11.2011, 21:02 |
по стандарту. да и как выбирать, какой деструктор выбрать при delete obj; ? Добавлено через 3 минуты и 16 секунд тока щаз понял - куда не передаёт ? |
| Автор: hawk3500 24.11.2011, 22:08 | ||
| Деструктор должен вернуть системе область памяти, выделенную при выполнении конструктора. По этому на входе ему никакие аргументы не требуются не нужны. Деструктор нельзя объявлять как принимающий аргументы. Класс может иметь сколько угодно конструкторов (с разными наборами параметров), в том числе шаблонных, и только один) деструктор. По сути можно сказать что деструктор есть не что иное как операция free. Конструктор и деструктор являются функциями только с точки зрения их синтаксического описания. Конструктор нельзя вызвать в любом месте, он всегда вызывается только в момент создания объекта. Деструкторы тоже не совсем таак сказать функции, но их можно вызвать в любом произвольном месте. Но есть несколько моментов которые надо учитывать: 1)конструктор выделяет область памяти под переменные класса(а не под функции-т.е. для всех классов одного и тогоже типа функии одни и теже и находятся по одному и томуже адресу). 2)при создании и инициализации указателя на класс можно и нужно пользоваться функцией delete .Исключение состовляет лишь такой случай:
3)код деструктора реально отрабатывает раньше функции free (class) |
| Автор: yull 25.11.2011, 02:07 | ||||
Спасибо, вы мне очень помогли) |
| Автор: Леопольд 25.11.2011, 19:03 | ||||
| Деструктор нужен для того что-бы освободить ресурсы, если есть. Если предполагается удалять объект по указатель или ссылке на базовый класс, тогда деструктор должен быть виртуальным, иначе деструкторы наследников не будут вызваны - неопределённое поведение. Конструктор не выделяет память, он её инициализирует, для этого у него есть одна особенность, которой нет у других функций - список инициализации. Выглядит вот так:
И конструкторы и деструкторы можно вызвать в любом месте, но двойной вызов конструктора или деструктора на один и тот же адрес памяти - неопределённое поведение. Т.е. так делать нельзя:
Есть определённый порядок вызова конструктора/деструктора для агрегированных типов и базовых классов. Конструктор вызывается сначала для базовых классов, если есть, потом для агрегированных типов в порядке их определения в классе (но не в списке инициализации), потом для самого класса. Порядок вызова деструктора полностью противоположен. |
| Автор: maxim1000 25.11.2011, 19:22 |
| Автоматический вызов деструктора - одна из важнейших особенностей C++. Если программисту приходится участвовать в этом процессе, передавая параметры или выбирая один из двух вариантов, то этот процесс становится гораздо менее автоматическим. |
| Автор: hawk3500 25.11.2011, 20:11 | ||
Т.е. как это не выделяет? А кто тогда выделяет?? При создании объекта и вызове конструктора выделяется память. А вызов конструктора без создания объекта не возможен. |
| Автор: Леопольд 25.11.2011, 20:28 |
| Память выделяется до того как будет вызван конструктор. Память может быть выделена в статической области данных процесса - объект "живёт" до тех пор, пока жив процесс. На стеке - память автоматически выделяется и освобождается на стеке процесса (при вызове функций, например) В куче - память выделяется программистом вручную, обычно при помощи оператора new. Освобождается тоже вручную, обычно при помощи оператора delete. Процесс освобождения желательно автоматизировать при помощи умных указателей. |
| Автор: hawk3500 25.11.2011, 20:41 |
| Ага, понял о чём вы. |
| Автор: mes 26.11.2011, 09:14 |
смотрите размещающий new, который может создать объект в любой заранее выделенной памяти.. |
| Автор: boostcoder 26.11.2011, 10:06 | ||||
компилятор подсчитывает размер класса эквивалентно сипользованию sizeof(). полученное значение передается оператору new, результат которого, используется по аналогии с placement new. т.е. такой вот "стенд" получился:
http://liveworkspace.org/code/444383e6535a6cc043662995399a6cd1 вывод:
обрати внимание на то, что delete применять к p1 нельзя из-за того, что он пытается вернуть выделенную память куче, в то время, как она на самом деле была выделена на стеке. а так же на то, что деструктор не затирает память, как иногда встречаются заблуждения. |