Partager via


Fonctionnement de new

L'élément allocation-expression (expression contenant l'opérateur new) exécute les opérations suivantes :

  • Localise et réserve le stockage pour les objets à allouer. Lorsque cette étape est terminée, la quantité correcte d'espace de stockage est allouée, mais ce n'est pas encore un objet.

  • Initialise les objets. Une fois que l'initialisation est terminée, les informations disponibles sont suffisantes pour que le stockage alloué soit un objet.

  • Retourne un pointeur vers les objets d'un type pointeur dérivé de new-type-name ou de type-name. Le programme utilise ce pointeur pour accéder au nouvel objet alloué.

L'opérateur new appelle la fonction operator new. Pour les tableaux de tout type et pour les objets qui ne sont pas de type classe, struct ou union, une fonction globale, ::operator new, est appelée pour allouer le stockage. Les objets de type de classe peuvent définir leur propre fonction membre statique operator new pour chaque classe.

Lorsque le compilateur rencontre l'opérateur new pour allouer un objet de type type, il émet un appel à type**::operator new( sizeof(** type ) ) ou, si aucun operator new défini par l'utilisateur n'est défini, ::operator new( sizeof( type ) ). Par conséquent, l'opérateur new peut allouer la quantité correcte de mémoire pour l'objet.

Notes

L'argument de operator new est de type size_t.Ce type est défini dans DIRECT.H, MALLOC.H, MEMORY.H, SEARCH.H, STDDEF.H, STDIO.H, STDLIB.H, STRING.H et TIME.H.

Une option dans la grammaire permet la spécification du paramètre placement (consultez la grammaire correspondant à l'opérateur new). Le paramètre placement peut être utilisé uniquement pour les implémentations définies par l'utilisateur de operator new ; il permet de transmettre des informations supplémentaires à operator new. Une expression avec un champ placement tel que T *TObject = new ( 0x0040 ) T; est traduite en T *TObject = T::operator new( sizeof( T ), 0x0040 ); si la classe T comporte un opérateur membre new, sinon elle est traduite en T *TObject = ::operator new( sizeof( T ), 0x0040 );.

L'objectif initial du champ placement est de permettre l'allocation d'objets dépendants du matériel à des adresses spécifiées par l'utilisateur.

Notes

Bien que l'exemple précédent indique un seul argument dans le champ placement, il n'existe aucune restriction sur le nombre d'arguments supplémentaires pouvant être transmis à operator new de cette façon.

Même si operator new a été défini pour un type de classe, l'opérateur global peut être utilisé en suivant la forme de l'exemple suivant :

T *TObject =::new TObject;

L'opérateur de résolution de portée (::) force l'utilisation de l'opérateur new global.

Voir aussi

Référence

new, opérateur (C++)