fonction d'opérateur
Lorsqu'une instruction telle que la suivante est produite dans un programme, elle traduit dans un appel à la fonction operator new:
Notes
char *pch = new char[BUFFER_SIZE];
Si la demande concerne les octets zéro de stockage, operator new retourne un pointeur vers un objet distinct (autrement dit, appels répétés pointeurs de retour d' operator new à différents).Si la mémoire insuffisante pour la demande d'allocation, operator new retourne NULL ou lève une exception (consultez Le nouveau les opérateurs et delete pour plus d'informations).
Vous pouvez écrire une routine qui tente pour libérer de la mémoire et recommencez l'allocation ; consultez _set_new_handler pour plus d'informations.Pour plus d'informations sur le schéma de récupération, consultez la rubrique suivante, Gérer les rapports insuffisants de mémoire.
Les deux places pour les fonctions d' operator new sont décrites dans le tableau suivant.
Place des nouvelles fonctions d'opérateur
Opérateur |
Portée |
---|---|
: : operator new |
Global |
nom de classe: : 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 d' operator new est appelée lorsque l'opérateur de nouveau est utilisé pour allouer des objets de types intégrés, les objets du type de classe qui ne contiennent pas de fonctions définies par l'utilisateur d' operator new , et les tableaux de tout type.Lorsque l'opérateur de nouveau est utilisé pour allouer les objets d'une classe tapez où operator new est défini, operator new de cette classe est appelée.
Une fonction d' operator new définie pour une classe est une fonction membre statique (qui ne peut pas ; par conséquent, être virtuelle) que les masque la fonction globale d' operator new pour les objets de ce type de classe.considérez le cas où nouveau est utilisé pour allouer et définir 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 à nouveau est passé à Blanks::operator new comme argument d' chInit .Toutefois, la fonction globale d' operator new est masquée, rendant pour générer du code tel que le suivant une erreur :
Blanks *SomeBlanks = new Blanks;
Dans Visual C++ 5,0 et versions antérieures, les types sans classe et tous les tableaux (qu'il s'ils étaient de type de classe ) alloués par l'opérateur de nouveau ont toujours utilisé la fonction globale d' operator new .
À partir de Visual C++ 5,0, le tableau membre nouveau en charge le compilateur et les opérateurs de suppression 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;
}