Что такое "::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,

:: означает просто глобальное пространство имен

Другие вопросы по тегам