Автор
|
Тема: new или malloc alloc
|
DimaK |
опубликован 09-02-2002 12:25 MSK
че лучше чем народ память выделяет
|
Muran
|
опубликован 09-02-2002 15:44 MSK
Вообщето лучше new-delete,чем malloc-free malloc - это сишная ф-ция. С new легче работать. А принципиально не отличаются. |
dvorobjov
|
опубликован 09-02-2002 20:19 MSK
Ан нет. Принципиальное отличие все же есть. В случае с new-delete можно предусмотреть специальные методы класса, выполняющие какие-то действия при создании первого объекта класса и при удалении последнего. |
Muran
|
опубликован 09-02-2002 21:25 MSK
2dvorobjov: Ты хоть раз так делал? Я нет. Все делалось в конструкторе. |
dvorobjov
|
опубликован 09-02-2002 21:44 MSK
For Mirah: Ты прав - не делал. Я вообше ++ использую только если это будет эфективнее и/или проще. Если будет возможность полистать книгу Джефри Рихтера "Создание эффективных WIN32 приложений с учетом специфики 64 разрядной Windows" посмотри главу посвяшенную Process heap. В ней описана вышеизложенная методика. |
dvorobjov
|
опубликован 09-02-2002 22:12 MSK
Sorry. В предыдущем мессадже опечатка: Вместо Mirah следует читать Muran |
tonik
|
опубликован 10-02-2002 03:12 MSK
Ну, если надо создать типизированные данные, то, конечно, без new-delete не обойтись, а если нужен просто void*-буфер, напр., для файлового копирования, то и malloc-free вполне сойдёт, я так считаю. |
frostbitten
|
опубликован 10-02-2002 04:15 MSK
Вообще с malloc (ну а значит и с new) есть трабл - CRTL для каждого модуля имеет свой хип. А потому если в одном модуле вы pByte = new BYTE [1000]; А в другом его delete[] pByte;... Не получится короче. Ну этот пример еще ниче, но если попытаться передать, напр. CString (ну да, ну да нельзя MFC'шные объекты передавать, но... хочеться ведь). То там тоже проблемы будут... но не сразу... Так что, если не надо чего-то специального (конструкторы, напр.) лучше, чем ::GlobalAlloc(GPTR ,...); нету. |
ADK
|
опубликован 11-02-2002 06:45 MSK
Господа, спор непринципиален. Различия С и C++ методов выделения памяти расписаны в большинстве учебников. new всегда вызывает С Runtime функции управления хипом, т.е. malloc. Так же как и delete вызывает free! Там есть различия в обработке нулевых указателей, кроме того, при отладке делаешь #define new DEBUG_NEW и отслеживаешь утечки... Короче, new и всё. Вопрос-то стоял как выыбор между ними. А GlobalAlloс и т.д. вроде как не обсуждался, кому надо, пусть Рихтера смотрят. |
Drunkard
|
опубликован 11-02-2002 11:52 MSK
Вопроса вообще не вижу. Какой-то набор слов, причем бессмысленый :)) |
dvorobjov
|
опубликован 11-02-2002 12:29 MSK
Вопрос есть! > че лучше чем народ память выделяетПонять его конечно можно по разному и в отношении контекста и постановки вопроса, и в отношении принадлежности. Ответ таков - почти всегда без разницы. Но, если вопрос поставлен о выделения памяты в цпп под объект, то было бы логичней пользоваться нью-делит. В классе можно предусмотреть метод оператора нью (и/или делит) и выполнять какие-то действия еще до вызова одного из конструкторов класса (и/или после вызова деструктора). Я думаю никто не будет спорить и доказывать что это минус. |
dvorobjov
|
опубликован 11-02-2002 12:35 MSK
Кстати о Рихтере: у меня есть электронная версия этой его книги на CD. (правда он сейчас на руках, но вернуть, если надо, не проблема) |
DimaK
|
опубликован 11-02-2002 13:53 MSK
2Drunkard ответа не вижу... 2all поясню прогамю без мфс классов обьктов по возможности в мсдн везде используют маллок вродебы это стандартные фунции виндов а нью сишные както там реализованы. так я и спрашиваю чем они оличаются если нью просто вызывает маллок то вопросов нет. а если не просто вот он вопрос то! |
Drunkard
|
опубликован 12-02-2002 03:11 MSK
Ты почитай, чё написал. Тут без бутылки нихрена ничего не поймешь. Ты чё, не русский, а? |
ADK
|
опубликован 12-02-2002 06:31 MSK
Юзай new и всё !!! Это же удобнее. И причём тут MFC, я вообще не понимаю. Кстати, у многих почему-то понятия MFC и С++ равнозначны. Вот, к примеру, статейка про кодинг на Дельфях в "Хакере": "С++ тоже не может создавать компактные программы, потому что MFC жрёт много места". Блин, чему учат ламеров!! :~(( |
al
|
опубликован 12-02-2002 11:13 MSK
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
2al: Ну когда программа линкуется с MFCDLL проблем нет это понятно... на так кто-нибудь делает, кроме как в Debug версии? Тащить за собой MFCDLL, по размеру превыщающую программу в разы... А не тащить нельзя... Потому что НЕЛЬЗЯ.А на счет ::GlobalAlloc, это вы наверное правы. Лучше всего HeapAlloc(::GetProcessHeap() ,...); |
al
|
опубликован 12-02-2002 15:52 MSK
Я тащу за собой MSFDLL, особых проблем нет. Она не "в разы" больше моего проекта, а даже немного поменьше. Если на каждый "чих" вызывать HeapAlloc, то это приведет к сильному торможению программы - malloc / free быстрее. По этому поводу уже был разговор в теме про фрагментацию памяти. |