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
.