Fonction de l'opérateur new
Lorsqu'une instruction comme la suivante est détectée dans un programme, elle se traduit par un appel à la fonction operator new :
Notes
char *pch = new char[BUFFER_SIZE];
Si la demande concerne les octets de stockage zéro, operator new retourne un pointeur vers un objet distinct. Autrement dit, les appels répétés à operator new retournent différents pointeurs. S'il existe une mémoire insuffisante pour la demande d'allocation, operator new retourne NULL ou lève une exception. (Pour plus d'informations, consultez Opérateurs new et delete.)
Vous pouvez écrire une routine qui tente de libérer de la mémoire et de recommencer l'allocation. Pour plus d'informations, consultez _set_new_handler. Pour plus d'informations sur le schéma de récupération, consultez la rubrique Gestion des conditions de mémoire insuffisante.
Les deux portées des fonctions operator new sont décrites dans le tableau suivant.
Portée des fonctions operator new
Opérateur |
Portée |
---|---|
::operator new |
Global |
class-name::operator new |
Classe |
Le premier argument de operator new doit être de type size_t (un type défini dans STDDEF.H) et le type de retour est toujours void *.
La fonction globale operator new est appelée lorsque l'opérateur new est utilisé pour allouer des objets de types intégrés, des objets de type classe qui ne contiennent pas de fonctions operator new définies par l'utilisateur et des tableaux de tout type. Lorsque l'opérateur new est utilisé pour allouer des objets d'un type de classe où operator new est défini, la fonction operator new de cette classe est appelée.
Une fonction operator new définie pour une classe est une fonction membre statique (qui ne peut donc être virtuelle) qui masque la fonction operator new globale pour les objets de ce type de classe. Prenons le cas où new est utilisé pour allouer et définir de la mémoire à une valeur donnée :
// spec1_the_operator_new_function1.cpp
#include <malloc.h>
#include <memory.h>
class Blanks
{
public:
Blanks(){}
void *operator new( size_t stAllocateBlock, char chInit );
};
void *Blanks::operator new( size_t stAllocateBlock, char chInit )
{
void *pvTemp = malloc( stAllocateBlock );
if( pvTemp != 0 )
memset( pvTemp, chInit, stAllocateBlock );
return pvTemp;
}
// For discrete objects of type Blanks, the global operator new function
// is hidden. Therefore, the following code allocates an object of type
// Blanks and initializes it to 0xa5
int main()
{
Blanks *a5 = new(0xa5) Blanks;
return a5 != 0;
}
L'argument fourni entre parenthèses à new est passé à Blanks::operator new comme argument chInit. Toutefois, la fonction globale operator new est masquée et le code similaire au code suivant génère une erreur :
Blanks *SomeBlanks = new Blanks;
Dans Visual C++ 5.0 et les versions antérieures, les types sans classe et tous les tableaux (qu'ils soient ou non de type class) alloués avec l'opérateur new ont toujours utilisé la fonction globale operator new.
À partir de Visual C++ 5.0, le compilateur prend en charge les opérateurs new et delete de tableau membre dans une déclaration de classe. Par exemple :
// spec1_the_operator_new_function2.cpp
class MyClass
{
public:
void * operator new[] (size_t)
{
return 0;
}
void operator delete[] (void*)
{
}
};
int main()
{
MyClass *pMyClass = new MyClass[5];
delete [] pMyClass;
}