Partager via


new, opérateur (<new>)

Fonction appelée par une nouvelle expression pour allouer le stockage pour les objets individuels.

void* operator new( 
   std::size_t _Count 
) throw(bad_alloc); 
void* operator new( 
   std::size_t _Count,         
   const std::nothrow_t& 
) throw( ); 
void* operator new( 
   std::size_t _Count,  
   void* _Ptr 
) throw( );

Paramètres

  • _Count
    Nombre d'octets de stockage à allouer.

  • _Ptr
    Le pointeur à retourner.

Valeur de retour

Un pointeur vers l'adresse ayant le moins d'octets de la mémoire nouvellement allouée. Ou _Ptr.

Notes

La première fonction est appelée par une nouvelle expression pour allouer _Count octets de stockage correctement alignés pour représenter un objet de cette taille. Le programme peut définir une autre fonction avec cette signature de fonction qui remplace la version par défaut définie par la Librairie C++ Standard et qui est ainsi remplaçable.

Le comportement désiré est le renvoi d'un pointeur non NULL uniquement si le stockage peut être alloué comme il a été demandé. Chaque allocation génère un pointeur vers le stockage disjoint de tout autre stockage alloué. L'ordre et la contiguïté du stockage alloué par des appels consécutifs ne sont pas spécifiés. La valeur de départ n'est pas spécifiée. Le pointeur retourné pointe vers le début (l'adresse d'octet la plus basse) du stockage alloué. Si le nombre est égal à zéro, la valeur retournée ne compare pas en égalité à une autre valeur retournée par la fonction.

Le comportement par défaut est l'exécution d'une boucle. Dans la boucle, la fonction tente d'abord d'allouer la mémoire demandée. Si la tentative implique un appel à malloc(size_t) n'est pas spécifié. Si la tentative est réussie, la fonction retourne un pointeur vers la mémoire allouée. Sinon, la fonction appelle le nouveau gestionnaireindiqué. Si la fonction appelée est retournée, la boucle se répète. La boucle se termine lorsqu'une tentative d'allouer la mémoire demandée a abouti ou si une fonction appelée n'est pas retournée.

Le comportement requis pour un nouveau gestionnaire est d'exécuter l'une des opérations suivantes :

  • Libérez plus de mémoire pour l'allocation et envoyez le return.

  • Appelez abort ou exit(int).

  • Levez un objet de type bad_alloc.

Le comportement par défaut d'un nouveau gestionnaire consiste à générer un objet de type bad_alloc. Un pointeur null indique le gestionnaire par défaut.

L'ordre et la contiguïté du stockage alloué par les appels successifs à operator new(size_t) ne sont pas spécifiés, de même que les valeurs initiales stockées dedans.

La deuxième fonction est appelée par une nouvelle expression de placement pour allouer _Count octets de stockage correctement alignés pour représenter un objet de cette taille. Le programme peut définir une autre fonction avec cette signature de fonction qui remplace la version par défaut définie par la Librairie C++ Standard et qui est ainsi remplaçable.

Le comportement par défaut consiste à retourner operator new(_Count) si la fonction réussit. Sinon, elle retourne un pointeur null.

La troisième fonction est appelée par une expression new de placement, au format new (args)T. Ici, les arguments consistent en un seul pointeur objet. Cela peut s'avérer utile pour construire un objet à une adresse connue. La fonction retourne _Ptr.

À l'espace de stockage libre alloué par operator new, appelez suppression d'opérateur.

Pour plus d'informations afin de savoir quand en solliciter un nouveau, consultez Les nouveaux opérateurs et leur suppression.

Exemple

// new_op_new.cpp
// compile with: /EHsc
#include<new>
#include<iostream>

using namespace std;

class MyClass 
{
public: 
   MyClass( )
   {
      cout << "Construction MyClass." << this << endl;
   };

   ~MyClass( )
   {
      imember = 0; cout << "Destructing MyClass." << this << endl;
   };
   int imember;
};

int main( ) 
{
   // The first form of new delete
   MyClass* fPtr = new MyClass;
   delete fPtr;

   // The second form of new delete
   MyClass* fPtr2 = new( nothrow ) MyClass;
   delete fPtr2;

   // The third form of new delete
   char x[sizeof( MyClass )];
   MyClass* fPtr3 = new( &x[0] ) MyClass;
   fPtr3 -> ~MyClass();
   cout << "The address of x[0] is : " << ( void* )&x[0] << endl;
}

Exemple de sortie

Construction MyClass.000B3F30
Destructing MyClass.000B3F30
Construction MyClass.000B3F30
Destructing MyClass.000B3F30
Construction MyClass.0023FC60
Destructing MyClass.0023FC60
The address of x[0] is : 0023FC60

Configuration requise

En-tête: <new>

Espace de noms : std

Voir aussi

Référence

new, opérateur (Exemples STL)

nothrow_t, structure

delete, opérateur (<new>)