Partager via


l'opérateur new (C++)

Alloue de la mémoire à un objet ou un tableau d'objets du nom de type du magasin désactivé et retourne un pointeur correctement typé et différent de zéro à l'objet.

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

Notes

Si infructueux, nouveau retourne zéro ou lève une exception ; consultez Le nouveau les opérateurs et delete pour plus d'informations.Vous pouvez modifier ce comportement par défaut en écrivant une routine de gestion des exceptions et en appelant la fonction de la bibliothèque Runtime de _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 nouveau est utilisé pour allouer de la mémoire à l'objet de classe C++, le constructeur de l'objet est appelé après que la mémoire est allouée.

utilisez l'opérateur de suppression pour libérer la mémoire allouée avec l'opérateur de nouveau .

L'exemple suivant alloue et libère un tableau à deux dimensions de caractères de taille dim par 10.En allouant un tableau multidimensionnel, toutes les dimensions à l'exception de la première doivent être des expressions constantes qui prennent des valeurs positives ; la dimension extrême gauche de tableau peut être une expression qui correspond à une valeur positive.En allouant un tableau à l'aide de l'opérateur de nouveau , la première dimension peut être zéro - le retour d'opérateur de nouveau un seul pointeur.

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

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

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

L'opérateur de nouveau n'allouent pas les types référence car ils ne sont pas des objets.

L'opérateur de nouveau ne peut pas être utilisé pour attribuer une fonction, mais elle peut être utilisée pour allouer les pointeurs fonction.L'exemple suivant alloue et libère un tableau de sept pointeurs vers des fonctions qui les entiers de retour.

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

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

La liste suivante décrit les éléments de syntaxe de nouveau:

  • positionnement
    Permet de passer des arguments supplémentaires si vous surchargez nouveau.

  • nom de type
    spécifie le type à allouer ; ce peut être un élément ou type défini par l'utilisateur.Si la spécification de type est compliquée, elle peut être entouré par des parenthèses pour forcer l'ordre de liaison.

  • initialiseur
    fournit une valeur pour l'objet initialisé.Les initialiseurs ne peuvent pas être spécifiés des tableaux.L'opérateur de nouveau crée des tableaux d'objets que si la classe contient un constructeur par défaut.

Exemple

L'exemple de code suivant alloue un tableau de caractères et un objet de classe CName puis le 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 de placement de l'opérateur de nouveau , le formulaire avec des arguments en plus de la taille de l'allocation, le compilateur ne prend en charge aucune forme de placement de l'opérateur de suppression 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 des opérateurs unaires

Mots clés C++

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

Initialisation d'objets alloués avec nouveau

Comment travail

fonction d'opérateur