Когда использовать Malloc вместо New [дубликат]
-
03-07-2019 - |
Вопрос
Дубликат: В каких случаях я использую malloc или new?
Просто перечитываю этот вопрос:
В чем разница между «новым», «malloc» и «calloc» в C++?
Я проверил ответы, но никто не ответил на вопрос:
- Когда мне следует использовать malloc вместо new?
Есть несколько причин (я могу назвать две).
Пусть лучшее всплывет наверх.
Решение
Пара, которая приходит на ум:
- Когда вам нужно, чтобы код был переносим между C++ и C.
- Когда вы выделяете память в библиотеке, которая может быть вызвана из C, и код C должен освободить выделение.
Другие советы
Из FAQ по Страуструпу new/malloc
Я написал в этой теме:
Всякий раз, когда вы используете malloc(), вы должны учитывать инициализацию и преобразование указателя возврата в правильный тип.Вам также придется подумать, получили ли вы количество байтов, подходящее для вашего использования.Если принять во внимание инициализацию, разницы в производительности между malloc() и new нет.
Это должно ответить на ваш вопрос.
Лучшая причина, по которой я могу использовать malloc в C++, — это взаимодействие с чистым API C.Некоторые API C, с которыми я работал, берут на себя ответственность за память определенных параметров.Таким образом, они отвечают за освобождение памяти, и, следовательно, память должна быть освобождена через free.Malloc подойдет для этой цели, но не обязательно новый.
В C++ почти никогда.new обычно является оберткой malloc, которая вызывает конструкторы (если применимо).
Однако, по крайней мере, с Visual C++ 2005 или более поздней версии, использование malloc может фактически привести к уязвимостям безопасности новых.
Рассмотрим этот код:
MyStruct* p = new MyStruct[count];
MyStruct* p = (MyStruct*)malloc(count* sizeof(MyStruct));
Они выглядят эквивалентно.Однако первый кодогенератор фактически проверяет наличие целочисленного переполнения в count * sizeof(MyStruct).
Если count поступает из ненадежного источника, это может вызвать целочисленное переполнение, в результате которого выделяется небольшой объем памяти, но затем, когда вы используете count, вы переполняете буфер.
Все упоминали (немного другими словами) об использовании библиотеки C, которая будет использовать free(), и таких много.
Другая ситуация, которую я вижу:
При разработке собственного управления памятью (потому что по какой-то причине, которую вы обнаружили в ходе моделирования, значение по умолчанию недостаточно хорошее).Вы можете выделить блок памяти с помощью malloc и инициализировать объекты в пулах, используя новое размещение.
Одна из причин заключается в том, что в C++ вы можете перегрузить оператор new.
Если вы хотите обязательно использовать распределение памяти системной библиотеки в своем коде, вы можете использовать malloc.
Программисту C++ редко, если вообще когда-либо, понадобится вызывать malloc.Единственная причина сделать это, о которой я могу думать, - это плохо сконструированный API, который ожидал, что вы перейдете в память malloc, потому что он будет делать это бесплатно.В вашем собственном коде new всегда должен быть равен malloc.
Если память должна быть освобождена с помощью функции free() (в вашем или чужом коде), то чертовски необходимо использовать malloc.
В противном случае я не уверен.Одним из надуманных случаев является случай, когда вы не хотите, чтобы деструктор(ы) запускались при выходе, но в этом случае у вас, вероятно, все равно должны быть объекты, которые в любом случае имеют неактивный dtor.
Вы можете использовать malloc, если не хотите беспокоиться о перехвате исключений (или используйте негенерирующую версию new).