Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/61: Рейтинг темы: голосов - 61, средняя оценка - 4.95
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
1

malloc

20.06.2008, 16:00. Показов 11616. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Народ, кто-нить может объяснить какие есть недостатки у этой функции, всегда юзал, а тут говорят, что это очень нехорошо, вот и стало интересно, почему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2008, 16:00
Ответы с готовыми решениями:

malloc, free error
Здравствуйте. Возникла следующая проблема. Код ниже: string http_headers = "GET /index.asd...

Функция malloc() динамически увеличивает выделение памяти по мере необходимости?
Допустим, задаю malloc(3). Т.е. 3 байта. А переменная (точнее, массив, который получается...

Аналог malloc
Необходимо релизовать свой malloc.Интересует меня следующее: как malloc опирирует памятью? Я...

Создание двунаправленного списка с использованием malloc(), free()
При заполнении списка вылазит ошибка "Вызвано исключение по адресу 0x0FE7373F (vcruntime140d.dll) в...

26
Почетный модератор
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
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
20.06.2008, 17:09 6
Ничего криминального это точно
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
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void * operator new( size_t cb )
{
        void *res = _nh_malloc( cb, 1 );
 
        RTCCALLBACK(_RTC_Allocate_hook, (res, cb, 0));
 
        return res;
}
 
// ...
 
void *__cdecl operator new(size_t size) _THROW1(_STD bad_alloc)
    {   // try to allocate size bytes
    void *p;
    while ((p = malloc(size)) == 0)
        if (_callnewh(size) == 0)
            _STD _Nomemory();
    return (p);
    }
Для особо непросвещенных: вся память выделяется ОС и потом в любом случае целесообразно использовать функции ядра по выделению куч.
Незнание аппаратной и системной части делает из вас неполноценных прогеров!

)))))))
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
21.06.2008, 00:47 11
Цитата Сообщение от DARK FURY Посмотреть сообщение
Я это еще знал когда начинал осваивать NET после VSC6
Понт зачтен,молодец,садись,пять...пригибаю колени в локтях.

Цитата Сообщение от DARK FURY Посмотреть сообщение
Незнание аппаратной и системной части делает из вас неполноценных прогеров!
Полноценных прогеров не бывает.Прогеры в основном занимаются тем,что заполняют пробелы в своих знаниях.
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
Цитата Сообщение от Vourhey Посмотреть сообщение
DARK FURY,
1. про то, что new это оператор было сказано выше. Спасибо за копипэйст.
2. в данном случае, речь идет не про то, что лучше использовать, а про недостатки конкретной функции.
3. Так как, мы говорим о С и в частности о malloc, то нам в любом случае целесообразно использовать функции и операторы самого языка, если мы этого хотим.
Поспешу Вам, также, напомнить, что malloc есть и на никсах и на окнах, а вот "функции ядра" будут отличаться. И это выйдет за рамки темы.

P. S. я, как неполноценный прогер, признаюсь, что не могу найти прямой связи malloc и аппаратной частью ПК.
+ 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
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
23.06.2008, 13:43  [ТС] 19
Vourhey, еще ни одного не видел начинающего, который бы освоил маллок раньше new, не согласен абсолютно с таким утверждением...
0
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 96
23.06.2008, 15:37 20
вот уж действительно )
в школе перво-наперво учили именно new, а про malloc дошли сведения только от препода в институте при обращении к нему с ошибкой выделения памяти.
0
23.06.2008, 15:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.06.2008, 15:37
Помогаю со студенческими работами здесь

В чем разница между malloc() и (char *)malloc()
Прошу помочь разобраться: не могу понять в чем разница междуs=malloc(sizeof(char)); иs=(char...

new vs malloc
Чем new безопаснее(или лучше?) malloc?

New и malloc
Если смотреть на выделение памяти для арифметических типов уступает ли функций new malloc'у в...

malloc в С++
Подскажите пожалуйста как в данной программе выделить динамическую память с помощью malloc для...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru