Подтвердить что ты не робот

Разница между глобальным оператором new и malloc

С++ имеет несколько функций для приобретения динамического хранилища, большинство из которых отличаются некоторым фундаментальным способом. Несколько других обычно добавляются ОС.

Два из них представляют особый интерес из-за их переносимости и подобия: malloc и ::operator new.

Существуют ли различия (w.r.t. стандарт и реализация) между глобальными void* operator new(size_t, ::std::nothrow&) и void* malloc(size_t)?

Поскольку, кажется, есть какая-то путаница, о чем я говорю, рассмотрим следующие два вызова:

void* p = ::std::malloc(10);
void* q = ::operator new(10, ::std::nothrow);

Очевидное и тривиальное различие заключается в том, как освободить память:

::std::free(p);
::operator delete(q);

Примечание. Этот вопрос не является дубликатом, например. В чем разница между new/delete и malloc/free?, поскольку он говорит об использовании глобального operator new, который фактически не выполняет никаких вызовов ctor.

4b9b3361

Ответ 1

Основные отличия, помимо синтаксиса и free vs. delete,

  • вы можете переносить replace ::operator new;
  • malloc поставляется с realloc, для которого new не имеет эквивалента;
  • new имеет концепцию new_handler, для которой нет эквивалента malloc.

(Замена malloc открывает can of worms. Это можно сделать, но не переносимо, потому что для этого требуется знание компоновщика.)

Ответ 2

Есть два различия, о которых я могу думать:

  • Какую функцию вы должны использовать для освобождения памяти, operator delete vs. free().

  • Программа С++ может юридически предоставить свою собственную версию ::operator new, и эта версия, как гарантируется, будет вызываться выражениями new. Невозможно переопределить malloc своей собственной версией.

Ответ 3

Макроскопическая разница, которую я вижу без дальнейших исследований, заключается в том, что метательный вариант глобального оператора ::new вызывает std::bad_alloc, если выделение не может быть выполнено, тогда как malloc возвращает NULL. Но я верю, что большинство различий, перечисленных здесь, относятся к глобальному оператору ::new, даже если тема о new.