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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.74
Mar-12
 Аватар для Mar-12
-21 / 5 / 1
Регистрация: 14.03.2013
Сообщений: 131
27.05.2013, 21:43     Чем new отличается от malloc? #1
Чем new отличается от malloc?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2013, 21:43     Чем new отличается от malloc?
Посмотрите здесь:

В чем разница malloc и calloc? C++
C++ Чем отличается С++ от Visual С++?
Чем отличаются ф-ии GlobalAllocPtr() и malloc()? C++
Чем отличается ln , lg, и log ? C++
C++ Чем ссылка отличается от указателя?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
27.05.2013, 21:45     Чем new отличается от malloc? #2
malloc не сможет правильно выделить память для типа данных который обладает собственным деструктором, конструктором и тд
Например, string.
Mar-12
 Аватар для Mar-12
-21 / 5 / 1
Регистрация: 14.03.2013
Сообщений: 131
08.06.2013, 17:17  [ТС]     Чем new отличается от malloc? #3
чем new отличается от malloc?
coloc
погромист
 Аватар для coloc
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
08.06.2013, 17:32     Чем new отличается от malloc? #4
new вызывает конструктор
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
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, а не вернет указатель черт знает на что.
Убежденный
Системный программист
 Аватар для Убежденный
14183 / 6198 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 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
 Аватар для Mar-12
-21 / 5 / 1
Регистрация: 14.03.2013
Сообщений: 131
08.06.2013, 17:57  [ТС]     Чем new отличается от malloc? #7
но под new все равно работает malloc?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
08.06.2013, 18:06     Чем new отличается от malloc? #8
Цитата Сообщение от Убежденный Посмотреть сообщение
Возможно, что-то еще...
Может бросать исключения, возвращать 0, вызывать обработчик new handler в зависимости от того как использовать
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.06.2013, 18:06     Чем new отличается от malloc? #9
Цитата Сообщение от Mar-12 Посмотреть сообщение
но под new все равно работает malloc?
Да. А под ним рантайм языка, а под ним системный вызов, а под ним MMU.
Убежденный
Системный программист
 Аватар для Убежденный
14183 / 6198 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 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?
Еще ссылки по теме:

C++ Чем отличается Абстрагирование от Наследования?
Чем C++ отличается от C++ Builder? C++
C++ В чем разница между new и malloc()?

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

Или воспользуйтесь поиском по форуму:
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 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?
Ответ Создать тему
Опции темы

Текущее время: 05:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru