O que são “:: operador new” e “:: operator delete”?

Eu sei new e delete são palavras-chave.

 int obj = new int; delete obj; int* arr = new int[1024]; delete[] arr; 

header é uma parte dos headers padrão do C ++. Tem dois operadores (não tenho certeza se são operadores ou são funções):

::operator new

::operator delete

esses operadores usados ​​como abaixo:

 #include  using namespace std; int* buff = (int*)::operator new(1024 * sizeof(int)); ::operator delete(buff); 

O que são “:: operador new” e “:: operator delete”? Eles são diferentes de palavras-chave new e de delete ?

:: diz ao compilador para chamar os operadores definidos no namespace global.
É o nome totalmente qualificado para os operadores globais new e delete .

Observe que é possível replace os operadores globais new e delete , bem como sobrecarregar os operadores new e delete específicos da class . Portanto, pode haver duas versões de new operadores e delete em um programa. O nome totalmente qualificado com o operador de resolução do escopo informa ao compilador que você está se referindo à versão global dos operadores e não aos específicos da class.

a new palavra-chave (usada sozinha) não é a mesma que a operator new function do operator new .

Chamando

 Object* p = new Object(value); 

é equvalente em chamar

 void* v = operaor new(sizeof(Object)); p = reinterpret_cast(v); p->Object::Object(value); //this is not legal C++, it just represent the implementation effect 

O operador new (ou melhor, o void* operator new(size_t) variant) apenas aloca memory, mas não faz nenhuma construção de object.

A new palavra-chave chama a nova function do operador, mas chama o construtor de object.

Para separar a alocação da construção, uma variante do operador new é declarada como

 void* operator new(size_t, void* at) { return at; } 

e o código anterior é tipicamente escrito como

 Object* p = reinterpret_cast(operator new(sizeof(Object))); //no contruction here new(p) Object(value); //calls operator new(size_t, void*) via keyword 

O operator new(size_t, void*) não faz nada por si só, mas, sendo invocado pela palavra-chave, resultará na chamada do contructor.

Inversamente, a destruição e a desalocação podem ser separadas

 p->~Object(); operator delete(p); //no destructor called 

em vez de delete p ; que chama o destruidor e, em seguida, o operator delete(void*) .

:: significa apenas um namespace global

Eles são funções de alocador e desalocador. O new operador faz duas coisas: ele chama uma function de alocador para obter a memory e chama o construtor do object. O operador delete também faz duas coisas: chama o destruidor e chama a function deallocator. A function de alocador padrão é ::operator new e a function de desalocador padrão é ::operator delete . Ambos podem ser substituídos pelo usuário.

Observe que em uma nova expressão, a ::operator new function ::operator new é pesquisada mais ou menos da mesma maneira que seria se fosse uma function normal chamada de dentro de uma function de membro. Quanto às funções normais, você pode qualificar o operador para alterar a pesquisa: o new MyClass irá encontrar um operator new membro operator new se estiver presente; ::new MyClass usará o alocador padrão, mesmo que o MyClass defina um operator new membro.