- malloc только выделяет память.
- new выделяет память (operator new) + создает объект в выделенной памяти (constructor). Передаваемый адрес в new может быть ссылкой или указателем.
- new - присутсвутет строгая гарантия исключений - атомарная операция, либо операция выполнена целиком, либо не выполнена полностью, поэтому нет промежуточного состояние операции. В этом случае идет откат к состоянию, которое было перед выполнением операции, которое вызвало исключение. Например, исключение в конструкторе - объект не создается, выделенная память освободится и утечки ресурсов не будет.
- malloc - allocate memory in heap, return void* - в случае успеха, nullptr - в случае неудачи (закончилась память).
- free - deallocate memory in heap.
- new - allocate memory in heap + constructor, return T* ptr = new T - в случае успеха, throw bad_alloc - в случае неудачи, конструктор прерывается и вызывается оператор удаления.
- new[] - allocate memory in heap + constructor для каждого элемента массива. При выбросе исключения в конструкторе, то у всех созданных элементов массива вызывается деструктор в порядке, обратном вызову конструктора, затем выделенная память освобождается.
- new (std::nothrow) - return T* ptr = new T - в случае успеха, nullptr - в случае неудачи.
- new (buffer) - allocate memory in placement - не выделяет память, а использует уже выделенную память (static, stack, heap) для вызова конструктора. Могут быть случаи, когда требуется переконструировать объект несколько раз (vector), поэтому в этих случаях размещение нового оператора может быть более эффективным.
- delete - destructor + deallocate memory in heap, Для указателей, которые nullptr/NULL не приводит к abort/terminate.
Примеры:
- delete(void*)0;
- int *ptr = nullptr;
delete ptr; - int *ptr = NULL;
delete ptr;
- delete[] destructor в порядке, обратном вызову конструктора + deallocate memory in heap.
Перегрузка operator new - отвечает за выделение «сырой памяти». Если в классе перегружается оператор new, то как правило в этом классе также перегружается operator delete. Вызов конструктора объекта остается без изменения.
Возможные случаи:
- требуется запрет создания объекта в кучe.
- память выделяется по особому (нестандартным способом), тогда оператор delete должен также освобождать эту память нестандартным способом.
- в классах. Наследование new/delete: если операторы определены в базовом классе, а в производном нет, то для производного класса также будет перегружены операторы new/delete, и будут использованы функции для выделения и освобождения памяти, определенные в базовом классе.
- глобальное (не рекомендуется), их нельзя выносить в namespace.