Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.74
Mar-12
-21 / 5 / 1
Регистрация: 14.03.2013
Сообщений: 130
#1

Чем new отличается от malloc? - C++

27.05.2013, 21:43. Просмотров 3758. Ответов 10
Метки нет (Все метки)

Чем new отличается от malloc?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 830
27.05.2013, 21:45     Чем new отличается от malloc? #2
malloc не сможет правильно выделить память для типа данных который обладает собственным деструктором, конструктором и тд
Например, string.
Mar-12
-21 / 5 / 1
Регистрация: 14.03.2013
Сообщений: 130
08.06.2013, 17:17  [ТС]     Чем new отличается от malloc? #3
чем new отличается от malloc?
coloc
погромист
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
08.06.2013, 17:32     Чем new отличается от malloc? #4
new вызывает конструктор
Гром
210 / 129 / 11
Регистрация: 20.03.2009
Сообщений: 1,103
Записей в блоге: 16
Завершенные тесты: 1
08.06.2013, 17:40     Чем new отличается от malloc? #5
malloc просто выделяет нужное количество памяти. Непосредственно после выполнения строки
C++
1
some_type* p = (some_type*)malloc(sizeof(some_type));
по указателю p находится мусор. Достоверно известно только что он указывает на область памяти нужного размера, на которую больше никто не претендует. После этого через этот указатель с данной областью памяти можно будет делать полезные вещи, т.к. тип указателя дает компилятору информацию, как с этой памятью работать.
Но можно компилятор и обмануть, сказав ему
C++
1
some_type* p = (some_type*)malloc(sizeof(another_type));
Тогда malloc честно выделит область памяти размера типа another_type и передаст указатель на нее. Но мы-то присваиваем адрес этой области памяти указателю some_type. И теперь компилятор будет работать с ней как с областью памяти, выделенной под совсем другое.

В то же время new мало того, что возвращает указатель именно на тот тип, который мы ему указали, так он еще и вызывает конструктор для этого типа. Так что на выходе мы имеем не сырую память подходящего размера, а полноценно сконструированный объект нужного типа (при условии, что подходящий конструктор работает как надо), и нам не нужно прямо здесь же вручную инициализировать эту область памяти нужными значениями. Кроме того, в случае неудачи new вызовет исключение bad_alloc, а не вернет указатель черт знает на что.
Убежденный
Системный программист
Эксперт С++
15293 / 6925 / 1095
Регистрация: 02.05.2013
Сообщений: 11,331
Завершенные тесты: 1
08.06.2013, 17:44     Чем new отличается от malloc? #6
new может использоваться только в C++. malloc - в C и в C++.
new вызывает конструктор объекта, malloc - нет.
new возвращает разный тип объекта, в зависимости от инициализатора, malloc - только <void *>.
new допускает разные формы ([], throw/nothrow, placement) и перегрузку, malloc - нет.

Возможно, что-то еще...
Mar-12
-21 / 5 / 1
Регистрация: 14.03.2013
Сообщений: 130
08.06.2013, 17:57  [ТС]     Чем new отличается от malloc? #7
но под new все равно работает malloc?
Croessmah
Модератор
Эксперт CЭксперт С++
13045 / 7308 / 814
Регистрация: 27.09.2012
Сообщений: 18,041
Записей в блоге: 3
Завершенные тесты: 1
08.06.2013, 18:06     Чем new отличается от malloc? #8
Цитата Сообщение от Убежденный Посмотреть сообщение
Возможно, что-то еще...
Может бросать исключения, возвращать 0, вызывать обработчик new handler в зависимости от того как использовать
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.06.2013, 18:06     Чем new отличается от malloc? #9
Цитата Сообщение от Mar-12 Посмотреть сообщение
но под new все равно работает malloc?
Да. А под ним рантайм языка, а под ним системный вызов, а под ним MMU.
Убежденный
Системный программист
Эксперт С++
15293 / 6925 / 1095
Регистрация: 02.05.2013
Сообщений: 11,331
Завершенные тесты: 1
08.06.2013, 18:45     Чем new отличается от malloc? #10
Цитата Сообщение от Mar-12 Посмотреть сообщение
но под new все равно работает malloc?
Стандартом это не гарантируется. Поэтому может быть и не malloc.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2013, 19:13     Чем new отличается от malloc?
Еще ссылки по теме:
Чем отличается ln , lg, и log ? C++
C++ Чем отличается С++ от Visual С++?
Чем C++ отличается от C++ Builder? C++
C++ Чем отличается Абстрагирование от Наследования?
C++ Чем отличается <string> и <cstring>?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
08.06.2013, 19:13     Чем new отличается от malloc? #11
malloc - функция, которая просто выделяет блок памяти размера, передаваемого в качестве параметра, и возвращает void указатель. при этом, чтобы присвоить указателю на какой-то объект адрес этой памяти, нужно сперва явно привести возвращаемое значение функции к нужному типу. При этом нет никакой проверки на удачное выделение.
Оператор new же выделяет память с проверкой (в случае ошибки генерирует bad_alloc) и с вызовом конструктора для объекта. Т.е. объект можно сразу проинициализировать. В случае пользовательский типов, конструктору вместе со списком параметров передается указатель this, содержащий адрес объекта в памяти. Притом не нужно никаких явных приведений типов. Также для своих типов можно перегрузить new, delete, либо их версии для массивов. Можно разместить объект по адресу, где заранее выделена память, передав в качестве второго параметра указатель. Деструктор при этом нужно будет вызывать явно, т.к. память для объекта мы не выделяем, а передаем лишь указатель.

Добавлено через 9 минут
 Комментарий модератора 
Темы объединены.
Yandex
Объявления
08.06.2013, 19:13     Чем new отличается от malloc?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru