Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.74
Mar-12
-21 / 5 / 3
Регистрация: 14.03.2013
Сообщений: 130
#1

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

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

Чем new отличается от malloc?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2013, 21:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Чем new отличается от malloc? (C++):

В чем разница между malloc и new?
в чем разница? что лучше использовать?

Чем отличаются ф-ии GlobalAllocPtr() и malloc()?
Здрасьте! Чем отличаются ф-ии GlobalAllocPtr() и malloc()? Спасибо!

В чем разница malloc и calloc?
подскажите пожалуйста,в чем разница malloc и calloc? эмалок выделение...

Malloc + reinterept_cast и new. В чем разница?
Уважаемые форумчане, скажите пожалуйста, в чем разница между этим: int*...

В чем разница между new и malloc()?
Всем доброго дня ! Начал читать книгу Пахомов Б. "C/C++ и MS Visual C++ 2008...

Чем отличается if от (?:)
Здравствуйте. Почитываю С++, сам программирую в Делфи. Вот немного запутался. В...

10
Olivеr
412 / 408 / 95
Регистрация: 06.10.2011
Сообщений: 832
27.05.2013, 21:45 #2
malloc не сможет правильно выделить память для типа данных который обладает собственным деструктором, конструктором и тд
Например, string.
0
Mar-12
-21 / 5 / 3
Регистрация: 14.03.2013
Сообщений: 130
08.06.2013, 17:17  [ТС] #3
чем new отличается от malloc?
0
coloc
погромист
411 / 247 / 30
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
08.06.2013, 17:32 #4
new вызывает конструктор
0
Гром
211 / 130 / 28
Регистрация: 20.03.2009
Сообщений: 1,108
Записей в блоге: 16
Завершенные тесты: 1
08.06.2013, 17:40 #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, а не вернет указатель черт знает на что.
0
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
08.06.2013, 17:44 #6
new может использоваться только в C++. malloc - в C и в C++.
new вызывает конструктор объекта, malloc - нет.
new возвращает разный тип объекта, в зависимости от инициализатора, malloc - только <void *>.
new допускает разные формы ([], throw/nothrow, placement) и перегрузку, malloc - нет.

Возможно, что-то еще...
0
Mar-12
-21 / 5 / 3
Регистрация: 14.03.2013
Сообщений: 130
08.06.2013, 17:57  [ТС] #7
но под new все равно работает malloc?
0
Croessmah
++Ͻ
14158 / 8083 / 1513
Регистрация: 27.09.2012
Сообщений: 19,921
Записей в блоге: 3
Завершенные тесты: 1
08.06.2013, 18:06 #8
Цитата Сообщение от Убежденный Посмотреть сообщение
Возможно, что-то еще...
Может бросать исключения, возвращать 0, вызывать обработчик new handler в зависимости от того как использовать
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
08.06.2013, 18:06 #9
Цитата Сообщение от Mar-12 Посмотреть сообщение
но под new все равно работает malloc?
Да. А под ним рантайм языка, а под ним системный вызов, а под ним MMU.
0
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
08.06.2013, 18:45 #10
Цитата Сообщение от Mar-12 Посмотреть сообщение
но под new все равно работает malloc?
Стандартом это не гарантируется. Поэтому может быть и не malloc.
0
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
08.06.2013, 19:13 #11
malloc - функция, которая просто выделяет блок памяти размера, передаваемого в качестве параметра, и возвращает void указатель. при этом, чтобы присвоить указателю на какой-то объект адрес этой памяти, нужно сперва явно привести возвращаемое значение функции к нужному типу. При этом нет никакой проверки на удачное выделение.
Оператор new же выделяет память с проверкой (в случае ошибки генерирует bad_alloc) и с вызовом конструктора для объекта. Т.е. объект можно сразу проинициализировать. В случае пользовательский типов, конструктору вместе со списком параметров передается указатель this, содержащий адрес объекта в памяти. Притом не нужно никаких явных приведений типов. Также для своих типов можно перегрузить new, delete, либо их версии для массивов. Можно разместить объект по адресу, где заранее выделена память, передав в качестве второго параметра указатель. Деструктор при этом нужно будет вызывать явно, т.к. память для объекта мы не выделяем, а передаем лишь указатель.

Добавлено через 9 минут
 Комментарий модератора 
Темы объединены.
0
08.06.2013, 19:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2013, 19:13
Привет! Вот еще темы с решениями:

Чем отличается this от *this?
Привет всем ! вот код template&lt;typename Key, typename Value&gt; Dictionary&lt;Key,...

Чем отличается С++ от Visual С++?
Здравствуете товарищи программисты! Только начал изучать язык программирования...

Чем C++ отличается от C++ Builder?
Чем C++ отличается от C++ Builder? И если имеется желание писать именно в...

Чем отличается ln , lg, и log ?
и как реализуются эти функцию в c++


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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