Вопрос по c++, new-operator – Что такое «:: operator new» и «:: operator delete»?
я знаю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
ключевые слова?
Это функции распределителя и освобождения.new
оператор делает
две вещи: он вызывает функцию распределителя, чтобы получить память, и это
вызывает конструктор объекта.delete
Оператор также делает
две вещи: он вызывает деструктор, а затем вызывает деаллокатор
функция. Функция распределителя по умолчанию::operator new
и
функция по умолчанию::operator delete
, Оба могут быть
заменено пользователем.
Обратите внимание, что в новом выражении::operator new
функция просматривается
более или менее таким же образом, как это было бы, если бы это было нормально
Функция вызывается из функции-члена. Что касается нормальных функций,
Вы можете квалифицировать оператора для изменения поиска:new MyClass
будут
найти членаoperator new
если кто-то присутствует;::new MyClass
буду использовать
распределитель по умолчанию, даже еслиMyClass
определяет членoperator
new
.
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
операторы.
Обратите внимание, что можнозаменить глобальныйnew
and delete
operators as well as overload class-specific new
and delete
operators, Так что может быть две версииnew
а такжеdelete
операторы в программе. Полное имя с оператором разрешения контекста говорит компилятору, что вы ссылаетесь на глобальную версию операторов, а не на классовые.
std::bad_alloc
или одна из немногих других функций, объявленных в заголовке. Он не нужен для стандартного нового размещения, независимо от того, пишете ли вы простоnew MyType
или же::new MyType
и это не нужно, если выnew
выражение разрешается для определенного пользователемoperator new
, а не один в стандартной библиотеке.
new
заголовок.
Amir Saniyan
::
означает просто глобальное пространство имен
new
такое ключевое слово, почему я должен использовать глобальное пространство имен?
Amir Saniyan