18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
|
||||||
1 | ||||||
Malloc vs new08.07.2015, 14:54. Показов 7703. Ответов 33
Метки нет (Все метки)
Здравствуйте.
Вникаю в ручное управление памятью. Абзац из книги "C++ для профессионалов" не совпадает с моим представлением использования объектов. Тут написано:
Из других источников прочел что malloc не вызывает конструктор. Но как это удается получить доступ к членам данных и методам объекта которого не существует. И образуется в памяти после выполнения malloc ? Или это значит что после выделения памяти при помощи malloc нужно вручную вызывать конструктор?
0
|
08.07.2015, 14:54 | |
Ответы с готовыми решениями:
33
В чем разница между malloc() и (char *)malloc() new vs malloc New и malloc malloc в С++ |
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
08.07.2015, 23:54 | 21 |
IGPIGP, я не очень понял твой абзац. Но я скажу так: вызов функции - это бесспорно выражение, тут ты прав. Но не всякое выражение - это функция. Вот в данном случае есть выражение new (в стандарте new-expression) и есть функция аллокации (allocation function), которая называется operator new (оператор new). Выражение new приводит к вызову функции аллокации. Само по себе выражение new - это не функция. Это синтаксическая конструкция языка, которая отвечает за:
1) вызов соответствующей заданному типу функции аллокации, либо глобальной функции аллокации (operator new). 2) вызов соответствующего заданному типу конструктора, либо за проведение default-инициализации для типов, у которых конструктора нет. Все это не является каким-то секретом или откровением и прямым текстом написано в стандарте языка.
0
|
Неэпический
|
||||||
08.07.2015, 23:57 | 22 | |||||
и как раз её перегрузить нельзя
Что касается placement-new, о это всего лишь вызов другой функции operator new, например такой:
то есть operator new при placement new просто возвращает переданный указатель, а не выделяет память. new-expression же "берет" этот указатель и строит объект по адресу. То есть new-expression одинаково работает как в placement new, так и "не в placement new"
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
09.07.2015, 00:04 | 23 |
Разумеется. Перегружать в С++ можно только функции (операторные или нет - не важно).
___ Товарищам, которые сейчас захотят вдуплить макрос, который переопределяет new, - сразу скажу, вы не правы. Ибо препроцессор не имеет никакого отношения к языку С++.
0
|
Комп_Оратор)
|
|
09.07.2015, 00:11 | 24 |
Кто говорил о всяком? new как операторная функция является частным случаем выражения. Всегда. Поэтому если в стандарте в одном месте она называется операторной функцией, а в другом месте выражением для стилистического разнообразия, то это возможно (хотя и путает). Но если это делается для противопоставления, то это не лучший стандарт. Моё мнение. Стандартов в жизни видел немало. Хороших гораздо меньше, чем просто стандартов.
Функция встроена в язык и синтаксически выполнена в виде оператора. Параметры передаются через пробел в том числе. Конструктор - параметр. Есть параметры передаваемые и в скобках... Ну и что? Так придумал автор и это удобно. Думаю, говоря об одном и том же мы теряем нить. Я выступил по поводу того что "new на самом деле не всегда запускает конструктор" сказав, что его можно и память научить не выделять. Объявить указатель на void и вернуть неинициализированный. Такая перегрузка скомпилируется. Это как оператор + перегрузить, чтобы он пел Соловья Алябьева. Поэтому я нахожу фразу: вполне уместной. А уточнение что new может и не вызывать конструктор не логично. Если захотеть, то есть немного того что нельзя было бы заставить не вызывать или наоборот вызывать что угодно. Особенно если речь идёт о перегрузке.
0
|
Неэпический
|
||||||
09.07.2015, 00:18 | 25 | |||||
НЕТ! Это сделано для различия именно оператора new и new-выражения:
operator new - просто выделяет сырую память, аля-malloc
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
09.07.2015, 00:21 | 26 |
О противопоставлении, вероятно, написано в статье (честно говоря я не ходил по ссылке). В стандарте никакого противопоставления нет. Одно включает другое. Вот в чем суть.
Но. Есть устоявшаяся терминология, которая диктуется официальным документом. Мы просто следуем ей и все. Если мы будем называть функцию выделения памяти - operator new - выражением new, мы пойдем в разрез с этой терминологией и запутаем собеседника, который с этой терминологией знаком. Здесь все-таки аналогия с оператором+ не совсем уместна. На функции аллокации накладываются целый свод требований Кликните здесь для просмотра всего текста
, которым они должны следовать, чтобы программа оставалась well-formed. Для operator+ таких требований нет. Говорить о корректности программы, опираясь лишь на ее компилируемость, я считаю, не совсем верно.
0
|
Комп_Оратор)
|
|
09.07.2015, 00:29 | 28 |
Это сделали враги рода человеческого (имхо). Саша, я понимаю разницу в вызове new A и new A()
Я пишу о том, что противопоставлять expression vs operator function это идея от лукавого. Что касается передаваемого параметра, то я привык считать, что когда имя конструктора (класса) передано без скобок то это значит что запускать конструктор не нужно и new его не запускает. Ну и что? Для POD типов даже конструкция вроде int(12345) ничего не запускает. Тут много нюансов созданных для синтаксического единообразия, в частности.
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|||||||||||
09.07.2015, 00:39 | 29 | ||||||||||
Запускает. Для класса (не POD) - запускает всегда. Для pod-типов запускается не конструктор, а default инициализация. Либо zero-инициализация. Что по сути своей выполняет функцию конструктора, хоть и формально конструктора нет.
Добавлено через 7 минут Вообще по факту есть
В этом плане тут все очень единообразно.
1
|
Неэпический
|
|
09.07.2015, 00:54 | 30 |
Здесь разница не в запуске конструкторов, а в том, что operator new - функция, а new-expression - синтаксическая конструкция языка.
Добавлено через 2 минуты мда... хреновый пример я привел... Добавлено через 11 минут Чтобы уж совсем показать разницу, в выражениях, посмотрим на то, каким выражением что является: new-expression - это unary expression "new" вызов operator new - это postfix expression "function call"
0
|
Комп_Оратор)
|
|
09.07.2015, 01:10 | 31 |
По умолчанию. Тут я уже написал не то. Сдаюсь. Ночью надо спать.
Перечитывая вопрос TC не вижу как он связан с operator new для выделения сырой памяти. Человек спрашивает: Почему есть доступ к членам по указателю как на инициализированный, так и не инициализированный объект. И строго говоря будь там среди членов еще указатель на char скажем, такой доступ может как угодно закончиться. То есть имелось в виду тоже не строгое утверждение. Но смыл сказанного ясен.
0
|
Croessmah
|
09.07.2015, 01:11
#32
|
0
|
DrOffset
|
09.07.2015, 01:17
#33
|
0
|
IGPIGP
|
09.07.2015, 08:23
Malloc vs new
#34
|
Не по теме: Может я уже забыл всё. Помню что new это операторная функция (в стандарте - expression :)) a operator new - функция. Вообще с операторами весело если смешивать лексически похожие вещи. Например + унари/бинари, и еще ++ префикс/постфикс и... ещё пара плюсов в названии. Запряжённых зарёю. :)
0
|
09.07.2015, 08:23 | |
malloc new, malloc, new на malloc Malloc си Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |