WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  new или malloc alloc

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   new или malloc alloc
DimaK опубликован 09-02-2002 12:25 MSK   Click Here to See the Profile for DimaK   Click Here to Email DimaK  
че лучше чем народ память выделяет
Muran опубликован 09-02-2002 15:44 MSK     Click Here to See the Profile for Muran  Click Here to Email Muran     
Вообщето лучше new-delete,чем malloc-free
malloc - это сишная ф-ция.
С new легче работать.
А принципиально не отличаются.
dvorobjov опубликован 09-02-2002 20:19 MSK     Click Here to See the Profile for dvorobjov  Click Here to Email dvorobjov     
Ан нет. Принципиальное отличие все же есть.
В случае с new-delete можно предусмотреть специальные методы класса, выполняющие какие-то действия при создании первого объекта класса и при удалении последнего.
Muran опубликован 09-02-2002 21:25 MSK     Click Here to See the Profile for Muran  Click Here to Email Muran     
2dvorobjov: Ты хоть раз так делал?
Я нет. Все делалось в конструкторе.
dvorobjov опубликован 09-02-2002 21:44 MSK     Click Here to See the Profile for dvorobjov  Click Here to Email dvorobjov     
For Mirah:
Ты прав - не делал. Я вообше ++ использую только если это будет эфективнее и/или проще.
Если будет возможность полистать книгу Джефри Рихтера "Создание эффективных WIN32 приложений с учетом специфики 64 разрядной Windows" посмотри главу посвяшенную Process heap. В ней описана вышеизложенная методика.
dvorobjov опубликован 09-02-2002 22:12 MSK     Click Here to See the Profile for dvorobjov  Click Here to Email dvorobjov     
Sorry. В предыдущем мессадже опечатка: Вместо Mirah следует читать Muran
tonik опубликован 10-02-2002 03:12 MSK     Click Here to See the Profile for tonik  Click Here to Email tonik     
Ну, если надо создать типизированные данные, то, конечно, без new-delete не обойтись, а если нужен просто void*-буфер, напр., для файлового копирования, то и malloc-free вполне сойдёт, я так считаю.
frostbitten опубликован 10-02-2002 04:15 MSK     Click Here to See the Profile for frostbitten  Click Here to Email frostbitten     
Вообще с malloc (ну а значит и с new) есть трабл - CRTL для каждого модуля имеет свой хип. А потому если в одном модуле вы

pByte = new BYTE [1000];

А в другом его delete[] pByte;... Не получится короче.
Ну этот пример еще ниче, но если попытаться передать, напр. CString (ну да, ну да нельзя MFC'шные объекты передавать, но... хочеться ведь). То там тоже проблемы будут... но не сразу...

Так что, если не надо чего-то специального (конструкторы, напр.) лучше, чем ::GlobalAlloc(GPTR ,...); нету.

ADK опубликован 11-02-2002 06:45 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
Господа, спор непринципиален. Различия С и C++ методов выделения памяти расписаны в большинстве учебников. new всегда вызывает С Runtime функции управления хипом, т.е. malloc. Так же как и delete вызывает free! Там есть различия в обработке нулевых указателей, кроме того, при отладке делаешь #define new DEBUG_NEW и отслеживаешь утечки... Короче, new и всё. Вопрос-то стоял как выыбор между ними. А GlobalAlloс и т.д. вроде как не обсуждался, кому надо, пусть Рихтера смотрят.
Drunkard опубликован 11-02-2002 11:52 MSK     Click Here to See the Profile for Drunkard  Click Here to Email Drunkard     
Вопроса вообще не вижу. Какой-то набор слов, причем бессмысленый :))
dvorobjov опубликован 11-02-2002 12:29 MSK     Click Here to See the Profile for dvorobjov  Click Here to Email dvorobjov     
Вопрос есть!
> че лучше чем народ память выделяет

Понять его конечно можно по разному и в отношении контекста и постановки вопроса, и в отношении принадлежности.

Ответ таков - почти всегда без разницы.

Но, если вопрос поставлен о выделения памяты в цпп под объект, то было бы логичней пользоваться нью-делит.
В классе можно предусмотреть метод оператора нью (и/или делит) и выполнять какие-то действия еще до вызова одного из конструкторов класса (и/или после вызова деструктора).
Я думаю никто не будет спорить и доказывать что это минус.

dvorobjov опубликован 11-02-2002 12:35 MSK     Click Here to See the Profile for dvorobjov  Click Here to Email dvorobjov     
Кстати о Рихтере:
у меня есть электронная версия этой его книги на CD. (правда он сейчас на руках, но вернуть, если надо, не проблема)
DimaK опубликован 11-02-2002 13:53 MSK     Click Here to See the Profile for DimaK  Click Here to Email DimaK     
2Drunkard ответа не вижу...
2all поясню прогамю без мфс классов обьктов по возможности в мсдн везде используют маллок вродебы это стандартные фунции виндов а нью сишные както там реализованы. так я и спрашиваю чем они оличаются если нью просто вызывает маллок то вопросов нет. а если не просто вот он вопрос то!
Drunkard опубликован 12-02-2002 03:11 MSK     Click Here to See the Profile for Drunkard  Click Here to Email Drunkard     
Ты почитай, чё написал. Тут без бутылки нихрена ничего не поймешь. Ты чё, не русский, а?
ADK опубликован 12-02-2002 06:31 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
Юзай new и всё !!! Это же удобнее. И причём тут MFC, я вообще не понимаю. Кстати, у многих почему-то понятия MFC и С++ равнозначны. Вот, к примеру, статейка про кодинг на Дельфях в "Хакере": "С++ тоже не может создавать компактные программы, потому что MFC жрёт много места". Блин, чему учат ламеров!! :~((
al опубликован 12-02-2002 11:13 MSK     Click Here to See the Profile for al  Click Here to Email al     
new / delete вызывают malloc / free, но это можно и переопределить. malloc / free в Windows в конце-концов обращаются к API. Но эти обращения "кешируются", т.е. память всегда выделяется кластерами, что ускоряет выделение памяти под мелкие объекты.
Самое главное, о чем по-моему никто не сказал, это то, что new / delete вызывают конструктор / деструктор. Кроме того, new устанавливает vptr класса. При помощи malloc / free этого сделать нельзя (стандартным путем). Таким образом, при работе с классами всегда следует использовать new / delete (и со структурами то же, т.к. структура - тот же класс).

2frostbitten: если использовать DLL версию CRT (msvcrt.dll), то этой проблемы не будет.
GlobalAlloc - УСТАРЕВШАЯ ФУНКЦИЯ, вот текст
из MSDN:
Note The global functions are slower than other memory management functions and do not provide as many features. Therefore, new applications should use the heap functions. However, the global functions are still used with DDE, the clipboard functions, and OLE data objects.
Обратите внимание: The global functions are SLOWER than other memory management functions...

Но про функции API забывать не стоит. В некоторых случаях (например, выделение очень больших буфферов) они будут более эффективными.

frostbitten опубликован 12-02-2002 15:37 MSK     Click Here to See the Profile for frostbitten  Click Here to Email frostbitten     
2al: Ну когда программа линкуется с MFCDLL проблем нет это понятно... на так кто-нибудь делает, кроме как в Debug версии? Тащить за собой MFCDLL, по размеру превыщающую программу в разы... А не тащить нельзя... Потому что НЕЛЬЗЯ.

А на счет ::GlobalAlloc, это вы наверное правы. Лучше всего HeapAlloc(::GetProcessHeap() ,...);

al опубликован 12-02-2002 15:52 MSK     Click Here to See the Profile for al  Click Here to Email al     
Я тащу за собой MSFDLL, особых проблем нет. Она не "в разы" больше моего проекта, а даже немного поменьше.
Если на каждый "чих" вызывать HeapAlloc, то это приведет к сильному торможению программы - malloc / free быстрее. По этому поводу уже был разговор в теме про фрагментацию памяти.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.