Вопрос по c++, new-operator – Что такое «:: operator new» и «:: operator delete»?

1

я знаюnew а такжеdelete являются ключевыми словами.

<code>int obj = new int;
delete obj;

int* arr = new int[1024];
delete[] arr;
</code>

<new> header является частью стандартных заголовков C ++. У него есть два оператора (я не уверен, что они являются операторами или они являются функциями):

::operator new

::operator delete

эти операторы используются как ниже:

<code>#include <new>
using namespace std;

int* buff = (int*)::operator new(1024 * sizeof(int));
::operator delete(buff);
</code>

Что такое & quot; :: оператор new & quot; и & quot; :: оператор удаления & quot ;? Отличаются ли они отnew а такжеdelete ключевые слова?

Ваш Ответ

4   ответа
3

Это функции распределителя и освобождения.new оператор делает две вещи: он вызывает функцию распределителя, чтобы получить память, и это вызывает конструктор объекта.delete Оператор также делает две вещи: он вызывает деструктор, а затем вызывает деаллокатор функция. Функция распределителя по умолчанию::operator newи функция по умолчанию::operator delete, Оба могут быть заменено пользователем.

Обратите внимание, что в новом выражении::operator new функция просматривается более или менее таким же образом, как это было бы, если бы это было нормально Функция вызывается из функции-члена. Что касается нормальных функций, Вы можете квалифицировать оператора для изменения поиска:new MyClass будут найти членаoperator new если кто-то присутствует;::new MyClass буду использовать распределитель по умолчанию, даже еслиMyClass определяет членoperator new.

+1 за различие между функцией распределения иnew-expression, Оба используютnew Ключевое слово в их синтаксисе.
5

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*).

3

:: говорит компилятору вызывать операторы, определенные в глобальном пространстве имен.
new а такжеdelete операторы.

Обратите внимание, что можнозаменить глобальныйnew and delete operators as well as overload class-specific new and delete operators, Так что может быть две версииnew а такжеdelete операторы в программе. Полное имя с оператором разрешения контекста говорит компилятору, что вы ссылаетесь на глобальную версию операторов, а не на классовые.

@AmirSaniyan Единственная причина (я знаю) включить новый заголовок, если вы хотите использоватьplacement new
@JamesKanze: True & amp; поэтому я связал соответствующий вопрос в качестве комментария. Один из ответов там (не принятый) удачно это проясняет.
@AmirSaniyan: Хорошо читаю:When is #include <new> library required in C++?
@ Как сказал Бендж: если вы используете одно из стандартных новых мест размещения. Или если вам нужен доступ кstd::bad_allocили одна из немногих других функций, объявленных в заголовке. Он не нужен для стандартного нового размещения, независимо от того, пишете ли вы простоnew MyType или же::new MyTypeи это не нужно, если выnew выражение разрешается для определенного пользователемoperator new, а не один в стандартной библиотеке.
Но программист должен включитьnew заголовок. Amir Saniyan
3

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

Вы не должны показывать, что вы используете новое из глобального пространства имен. Но вы можете переопределить вашу новую версию, тогда вы будете использовать ваше пространство имен, если вам нужно
когдаnew такое ключевое слово, почему я должен использовать глобальное пространство имен? Amir Saniyan

Похожие вопросы