Разница между глобальным оператором 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.
Ответы
Ответ 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
.