Что такое "::operator new" и "::operator delete"?
Я знаю new
а также delete
являются ключевыми словами.
int obj = new int;
delete obj;
int* arr = new int[1024];
delete[] arr;
<new>
header является частью стандартных заголовков C++. У него есть два оператора (я не уверен, что они являются операторами или они являются функциями):
::operator new
::operator delete
эти операторы используются как ниже:
#include <new>
using namespace std;
int* buff = (int*)::operator new(1024 * sizeof(int));
::operator delete(buff);
Что такое ":: operator new" и ":: operator delete"? Отличаются ли они от new
а также delete
ключевые слова?
4 ответа
::
говорит компилятору вызывать операторы, определенные в глобальном пространстве имен.
Это полное название для глобального new
а также delete
операторы.
Обратите внимание, что можно заменить глобальный new
а также delete
операторы, а также перегрузка для конкретного класса new
а также delete
операторы. Так что может быть две версии new
а также delete
операторы в программе. Полное имя с оператором разрешения контекста говорит компилятору, что вы ссылаетесь на глобальную версию операторов, а не на классовые.
new
ключевое слово (используется отдельно) не совпадает с operator new
функция.
призвание
Object* p = new Object(value);
эквивалентен в вызове
void* v = operaor new(sizeof(Object));
p = reinterpret_cast<Object*>(v);
p->Object::Object(value); //this is not legal C++, it just represent the implementation effect
Оператор новый (или лучше void* operator new(size_t)
вариант) просто выделяю память, но не занимаюсь никаким построением объекта.
new
Ключевое слово вызывает оператор новой функции, но затем вызывает конструктор объекта.
Чтобы отделить распределение от строительства, вариант оператора new объявляется как
void* operator new(size_t, void* at)
{ return at; }
и предыдущий код обычно пишется как
Object* p = reinterpret_cast<Object*>(operator new(sizeof(Object))); //no contruction here
new(p) Object(value); //calls operator new(size_t, void*) via keyword
operator new(size_t, void*)
сам по себе ничего не делает, но при вызове ключевого слова вызывается конструктор.
И наоборот, разрушение и освобождение могут быть разделены
p->~Object();
operator delete(p); //no destructor called
вместо delete p
; который вызывает деструктор, а затем operator delete(void*)
,
Это функции распределителя и освобождения. new
Оператор делает две вещи: он вызывает функцию распределителя для получения памяти и вызывает конструктор объекта. delete
Оператор также делает две вещи: он вызывает деструктор, а затем вызывает функцию deallocator. Функция распределителя по умолчанию ::operator new
, и функция по умолчанию освобождает ::operator delete
, Оба могут быть заменены пользователем.
Обратите внимание, что в новом выражении ::operator new
Функция ищется более или менее таким же образом, как если бы это была нормальная функция, вызываемая из функции-члена. Что касается обычных функций, вы можете квалифицировать оператора для изменения поиска: new MyClass
найдет члена operator new
если кто-то присутствует; ::new MyClass
будет использовать распределитель по умолчанию, даже если MyClass
определяет член operator
new
,