Partager via


new, opérateur (C++)

Alloue de la mémoire pour un objet ou un tableau d'objets de type-name du magasin gratuit et retourne un pointeur différent de 0, correctement typé vers l'objet.

Notes

Microsoft C++ Component Extensions fournit la prise en charge du mot clé new pour ajouter des entrées d'emplacement vtable.Pour plus d'informations, consultez nouveau (nouvel emplacement dans vtable)

[::] new [placement] new-type-name [new-initializer]
[::] new [placement] ( type-name ) [new-initializer]

Notes

En cas d'échec, new retourne zéro ou lève une exception ; consultez Les opérateurs new et delete pour plus d'informations. Vous pouvez modifier ce comportement par défaut en écrivant une routine personnalisée de gestion des exceptions et en appelant la fonction de bibliothèque du runtime _set_new_handler avec le nom de fonction comme argument.

Pour plus d'informations sur la création d'un objet sur le tas managé, consultez gcnew.

Lorsque new est utilisé pour allouer la mémoire à un objet de classe C++, le constructeur de l'objet est appelé après que la mémoire est allouée.

Utilisez l'opérateur delete pour libérer la mémoire allouée avec l'opérateur new.

L'exemple suivant alloue, puis libère un tableau de caractères à deux dimensions de taille dim par 10. En allouant un tableau multidimensionnel, toutes les dimensions sauf la première doivent être des expressions constantes qui s'analysent comme valeurs positives ; la dimension du tableau la plus à gauche peut être une expression qui s'analyse comme valeur positive. En allouant un tableau à l'aide de l'opérateur new, la première dimension peut être zéro. L'opérateur new retourne un seul pointeur.

char (*pchar)[10] = new char[dim][10];
delete [] pchar;

type-name ne peut pas contenir const, volatile, des déclarations de classe ou des déclarations d'énumération. Par conséquent, l'expression suivante n'est pas conforme :

volatile char *vch = new volatile char[20];

L'opérateur new n'alloue pas de types référence, car il ne s'agit pas d'objets.

L'opérateur new ne peut pas être utilisé pour allouer une fonction. Toutefois, il peut être utilisé pour allouer des pointeurs aux fonctions. L'exemple suivant alloue, puis libère un tableau de sept pointeurs vers des fonctions qui retournent des entiers.

int (**p) () = new (int (*[7]) ());
delete *p;

Si vous utilisez l'opérateur new sans argument supplémentaire et compilez avec les options /GX, /EHa ou /EHs le compilateur générera du code pour appeler l'opérateur delete si le constructeur lève une exception.

La liste suivante décrit les éléments de grammaire de new :

  • placement
    Permet de passer des arguments supplémentaires si vous surchargez new.

  • type-name
    Spécifie le type à allouer ; il peut s'agir d'un type intégré ou d'un type défini par l'utilisateur. Si la spécification de type est compliquée, elle peut être placée entre parenthèses pour forcer l'ordre de liaison.

  • initializer
    Fournit une valeur pour l'objet initialisé. Les initialiseurs ne peuvent pas être spécifiés pour des tableaux. L'opérateur new crée des tableaux d'objets uniquement si la classe a un constructeur par défaut.

Exemple

L'exemple de code suivant alloue un tableau de caractères et un objet de classe CName, puis les libère.

// expre_new_Operator.cpp
// compile with: /EHsc
#include <string.h>

class CName {
public:
   enum {
      sizeOfBuffer = 256
   };

   char m_szFirst[sizeOfBuffer];
   char m_szLast[sizeOfBuffer];

public:
   void SetName(char* pszFirst, char* pszLast) {
     strcpy_s(m_szFirst, sizeOfBuffer, pszFirst);
     strcpy_s(m_szLast, sizeOfBuffer, pszLast);
   }

};

int main() {
   // Allocate memory for the array
   char* pCharArray = new char[CName::sizeOfBuffer];
   strcpy_s(pCharArray, CName::sizeOfBuffer, "Array of characters");

   // Deallocate memory for the array
   delete [] pCharArray;           
   pCharArray = NULL;

   // Allocate memory for the object
   CName* pName = new CName;
   pName->SetName("Firstname", "Lastname");

   // Deallocate memory for the object
   delete pName;
   pName = NULL;
}

Si vous utilisez la nouvelle forme positionnement de l'opérateur new, la forme avec arguments en plus de la taille d'allocation, le compilateur ne prend pas en charge une forme positionnement de l'opérateur delete si le constructeur lève une exception. Par exemple :

// expre_new_Operator2.cpp
// C2660 expected
class A {
public:
   A(int) { throw "Fail!"; }
};
void F(void) {
   try {
      // heap memory pointed to by pa1 will be deallocated
      // by calling ::operator delete(void*).
      A* pa1 = new A(10);
   } catch (...) {
   }
   try {
      // This will call ::operator new(size_t, char*, int).
      // When A::A(int) does a throw, we should call
      // ::operator delete(void*, char*, int) to deallocate
      // the memory pointed to by pa2.  Since
      // ::operator delete(void*, char*, int) has not been implemented,
      // memory will be leaked when the deallocation cannot occur.

      A* pa2 = new(__FILE__, __LINE__) A(20);
   } catch (...) {
   }
}

int main() {
   A a;
}

Voir aussi

Référence

Expressions avec opérateurs unaires

Mots clés C++

Durée de vie des objets alloués avec new

Initialisation des objets alloués avec new

Fonctionnement de new

Fonction de l'opérateur new