Вопрос

Дубликат: В каких случаях я использую 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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top