/ / Que sont “:: operator new” et “:: operator delete”? - c ++, new-operator, operator-keyword, delete-operator

Que sont “:: operator new” et “:: operator delete”? - c ++, new-operator, operator-keyword, delete-operator

je connais new et delete sont des mots-clés.

int obj = new int;
delete obj;

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

<new> header est une partie des en-têtes standard C ++. Il a deux opérateurs (je ne suis pas sûr que ce soient des opérateurs ou des fonctions):

::operator new

::operator delete

ces opérateurs utilisés comme ci-dessous:

#include <new>
using namespace std;

int* buff = (int*)::operator new(1024 * sizeof(int));
::operator delete(buff);

Que sont ":: operator new" et ":: operator delete"? Sont-ils différents de new et delete mots clés?

Réponses:

3 pour la réponse № 1

:: indique au compilateur d'appeler les opérateurs définis dans l'espace de noms global.
C’est le nom qualifié complet pour le global new et delete les opérateurs.

Notez que l'on peut remplacer le global new et delete opérateurs ainsi que la surcharge spécifique à la classe new et delete les opérateurs. Donc, il peut y avoir deux versions de new et delete opérateurs dans un programme. Le nom complet avec l'opérateur de résolution d'étendue indique au compilateur que vous faites référence à la version globale des opérateurs et non à celle spécifique à la classe.


4 pour la réponse № 2

la new mot-clé (utilisé seul) n'est pas le même que le operator new fonction.

Appel

Object* p = new Object(value);

est équivalent à appeler

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

L’opérateur new (ou mieux le void* operator new(size_t) variante) alloue simplement de la mémoire, mais ne fait aucune construction

le new mot-clé appelle l'opérateur nouvelle fonction, mais appelle ensuite le constructeur d'objet.

Pour séparer l’allocation de la construction, une variante de l’opérateur new est déclarée comme

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

et le code précédent est généralement écrit en tant que

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

le operator new(size_t, void*) ne fait rien en soi, mais, étant invoqué par le mot clé, le constructeur sera appelé.

Inversement, destruction et désallocation peuvent être séparés par

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

au lieu de delete p; qui appelle le destructeur, puis operator delete(void*).


3 pour la réponse № 3

:: signifie juste un espace de noms global


3 pour la réponse № 4

Ce sont des fonctions allocateur et désallocateur. le new l'opérateur fait deux choses: il appelle une fonction allocateur pour obtenir la mémoire, et il appelle le constructeur de l'objet. le delete l'opérateur fait aussi deux choses: il appelle le destructeur, puis appelle le désallocateur une fonction. La fonction allocateur par défaut est ::operator new, et le fonction de désallocation par défaut est ::operator delete. Les deux peuvent être remplacé par l'utilisateur.

Notez que dans une nouvelle expression, le ::operator new la fonction est regardée dans plus ou moins la mêmecomme ce serait s'il était normal fonction appelée depuis une fonction membre. En ce qui concerne les fonctions normales, vous pouvez qualifier l'opérateur pour changer la recherche: new MyClass volonté trouver un membre operator new si on est présent; ::new MyClass utilisera l'allocateur par défaut, même si MyClass définit un membre operator new.