Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
|
|
1 | |
malloc20.06.2008, 16:00. Показов 11616. Ответов 26
Метки нет (Все метки)
Народ, кто-нить может объяснить какие есть недостатки у этой функции, всегда юзал, а тут говорят, что это очень нехорошо, вот и стало интересно, почему?
0
|
20.06.2008, 16:00 | |
Ответы с готовыми решениями:
26
malloc, free error Функция malloc() динамически увеличивает выделение памяти по мере необходимости? Аналог malloc Создание двунаправленного списка с использованием malloc(), free() |
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
20.06.2008, 16:19 | 2 |
Хм. А эти люди не смогли объяснить, почему это очень нехорошо? Спроси, что они используют.
Недостатков не вижу особых. Также выделяет память в куче. Разве что, на linux, по-моему, есть такая весчь, что эта функция может вернуть ненулевой указатель, но нет гарантии, что память будет доступна. Такая оптимичтичная политика, насколько я понял, основывается на том, что есть OOM Killer.
0
|
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
|
|
20.06.2008, 16:30 [ТС] | 3 |
ссылались на Страуструпа и Сепольского, типа через new веселее получается
0
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
20.06.2008, 16:49 | 4 |
Да не...ссылаться можно на что угодно. Главное, понять почему так. Если они ссылаются на Страуструпа, значит, сами не знают
Хотя, думаю, можно понять, на что они ссылаются. malloc ничего с памятью не делает. То есть мы получим мусор в памяти, когда будем резервировать. Так же, нам понадобиться привести void * к нужному нам. New заранее передается тип. Он вызывает опреатор *oeprator new для типа. Таким образом, выделяет память под заранее известный тип, а также инициализирует его. То есть, мы даже в своем классе можем переписать new. Ну...нам еще расчитывать кодичество памяти не нужно. К примеру для выделения под массив четырех int пишем: Код
malloc(sizeof(int)*4)
0
|
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
|
|
20.06.2008, 16:57 [ТС] | 5 |
мне тоже кажется, что ничего криминального в использовании такого способа выделения памяти нет, это просто слишком начитанные попались))))
0
|
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|
20.06.2008, 17:14 | 7 |
Основное отличие new от malloc в том,что new вызывает конструктор. Таким образом инициализируется память. Может сэкономить силы при отладке - если в памяти мусор - тяжелее разглядеть ошибку...
На этом различия,вроде бы,заканчиваются.Ходят кругом слухи,что память они выделяют как-то по-разному,но я не вникал - всегда хватало здравого смысла не заменять delete на free(я всегда использовал new) . Да и,я так понимаю,их совместимость не оговорена и зависит от реализации.
0
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
20.06.2008, 17:32 | 8 |
Я чаще malloc, calloc, использую для "обычных" опреаций. А для объектов класса - new. Ибо, не имеет мне смысла делать еще и обнуление массива, когда его будет заполнять, к примеру, пользователь. Зачем...
Мы пришли к выводу, что ничего опасного нет в использовании malloc и free. Если более-менее внимателен.
0
|
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 96
|
|
20.06.2008, 18:26 | 9 |
мне, кстати, тоже говорили, что allokи эти все - жутко плохо, но безосновно, аппелируя лишь тем, что 'как-то криво у них там память выделяется'
для статистики: всегда использую new. наверное, все-таки удобнее выделять уже инициализированную память.
0
|
DARK FURY
|
||||||
21.06.2008, 00:04 | 10 | |||||
Алоки, стандарты С++.
new delete это операторы или расширения языка использующие алоки Я это еще знал когда начинал осваивать NET после VSC6
Незнание аппаратной и системной части делает из вас неполноценных прогеров! ))))))) |
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|
21.06.2008, 00:47 | 11 |
Понт зачтен,молодец,садись,пять...пригибаю колени в локтях.
Полноценных прогеров не бывает.Прогеры в основном занимаются тем,что заполняют пробелы в своих знаниях.
0
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
21.06.2008, 01:04 | 12 |
DARK FURY,
1. про то, что new это оператор было сказано выше. Спасибо за копипэйст. 2. в данном случае, речь идет не про то, что лучше использовать, а про недостатки конкретной функции. 3. Так как, мы говорим о С и в частности о malloc, то нам в любом случае целесообразно использовать функции и операторы самого языка, если мы этого хотим. Поспешу Вам, также, напомнить, что malloc есть и на никсах и на окнах, а вот "функции ядра" будут отличаться. И это выйдет за рамки темы. P. S. я, как неполноценный прогер, признаюсь, что не могу найти прямой связи malloc и аппаратной частью ПК.
0
|
DARK FURY
|
|
22.06.2008, 14:57 | 13 |
+ new и delete:
1. Он очень удобен и не требует расписывания 2. В нем есть обработчики ошибок и исключений 3. Переносимость на другие компиляторы, а также под другие ОС - new и delete: 1. операция делает большой путь от вызова к возврату указателя выделенной памяти. 2. зависим от библиотеки CRT(в студии) а про то что было выше сказано - так это у меня от впечатления того, что акцент делался на якобы два пути решения проблемы, а на самом деле (new->malloc->HeapAlloc) это просто уровни использования. Под нискы в любом случае прийдется перекомпилировать прогу и думаю не составит труда поменять функции API на аналогичные линукс. PS Я избавляюсь от CRT. |
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
22.06.2008, 15:35 | 14 |
Одно дело перекомпилировать. Другое - менять код.
Ах ты батюшки, от CRT избавляемся. А еще можно на асме писать...молчу про опции компилера избавляющие от стартового кода CRT... Будь адекватным. Есть стандарт языка. Есть его реализация. Стандарт это наличие malloc и new. А вот их внутренняя реализация может отличаться. Некоторые компилеры С реализуют new не через malloc. Поэтому цепочка: new->malloc->HeapAlloc Верна не для всех случаев. Дальше: + malloc 1. Удобен и интуитивно понятен. 2. Хорошо использовать, если не нужно инициализировать, не нужно вызывать конструктор создаваемого объекта. 3. Переносимость. 4. Также есть handler для обработки ошибок. Да и NULL вернет, в конце-концов. - 1. CRT (не считаю проблемой) 2. Невнимательность программиста. Кроме того, реализаций malloc несколько (BSD, Hoard).
0
|
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
|
|
23.06.2008, 09:32 [ТС] | 15 |
DARK FURY, мы как раз и завели эту беседу, чтобы больше знать... программистами не рождаются, так что всеми силами пытаемся свою неполноценность уменьшить... Просто сама тема возникла из утверждения, что юзать маллоки незачетно, вот и захотелось узнать мнение других...
0
|
kbsko
|
|
23.06.2008, 13:27 | 16 |
malloc and calloc функции выделения памяти - они считаються плохим стилем программирования и используються начинающими програмистами а new это функция запускает конструктор а констрктор и деструктор если умеешь ими пользоваться то проблем не возникает и более просто достич более высокоуровневых задач
|
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
|
|
23.06.2008, 13:30 [ТС] | 17 |
ты на счет молодых программистов перегнул... да и вообще странное понятие - плохой стиль программирования ИМХО... если есть какие-то возможности языка, то почему бы их не использовать, если они тебе жизнь упростят... я даже иногда goto использую...
0
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
23.06.2008, 13:41 | 18 |
Использовать goto тоже хорошо, если к месту, ты прав.
P. S. Ну что, я сделал вывод, что крутые программеры всегда и везде используют new, а malloc.h создавалась для начинающих... ок. спасибо за ликбез ) ( Это метафора )
0
|
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 96
|
|
23.06.2008, 15:37 | 20 |
вот уж действительно )
в школе перво-наперво учили именно new, а про malloc дошли сведения только от препода в институте при обращении к нему с ошибкой выделения памяти.
0
|
23.06.2008, 15:37 | |
23.06.2008, 15:37 | |
Помогаю со студенческими работами здесь
20
В чем разница между malloc() и (char *)malloc() new vs malloc New и malloc malloc в С++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |