nuova funzione operatore
Quando un'istruzione seguente viene rilevato in un programma, converte in una chiamata alla funzione operator new:
Note
char *pch = new char[BUFFER_SIZE];
se la richiesta è per i byte zero di archiviazione, operatore new restituisce un puntatore a un oggetto distinto (ovvero chiamate ripetute a operatore new puntatori diversi di restituzione).Se c " è memoria sufficiente per la richiesta di allocazione, operatore new restituisce NULL o genera un'eccezione (vedere Il nuovo gli operatori e delete per ulteriori informazioni.
È possibile scrivere una routine che tenta la memoria e riprovate l'allocazione; vedere _set_new_handler per ulteriori informazioni.Per ulteriori informazioni sulla combinazione di recupero, vedere il seguente argomento, Gestire gli stati di memoria insufficiente.
i due ambiti per operator new le funzioni sono descritte nella tabella seguente.
Ambito per le nuove funzioni dell'operatore
Operatore |
Ambito |
---|---|
:: operatore new |
Global |
nome della classe:: operatore new |
Classe |
il primo argomento a operatore new deve essere di tipo size_t (un tipo definito da STDDEF.H) e il tipo restituito è sempre void *.
il globale operatore new la funzione viene chiamata quando nuovo l'operatore viene utilizzato per allocare oggetti di tipi incorporati, oggetti del tipo di classe che non contengono definito dall'utente operatore new le funzioni e matrici di qualsiasi tipo.quando nuovo l'operatore viene utilizzato per allocare oggetti del tipo di classe in cui operatore new viene definito, tale classe operatore new viene chiamato.
operatore new la funzione definita per una classe è una funzione membro statico (che non è possibile, pertanto, essere virtuale) che nasconde il globale operatore new funzione per gli oggetti del tipo di classe.Si consideri il caso in cui nuovo viene utilizzato per allocare e impostare la memoria in un determinato valore:
// 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'argomento fornito tra parentesi a nuovo è stato passato a Blanks::operator new come chInit argomento.tuttavia, il globale operatore new la funzione è nascosta, forzando il codice seguente per generare un errore:
Blanks *SomeBlanks = new Blanks;
In Visual C++ 5,0 e tipi di nonclass e versioni precedenti e tutte le matrici (indipendentemente dal fatto che erano di classe tipo) allocato tramite nuovo l'operatore ha sempre utilizzato il globale operatore new funzione.
A partire da Visual C++ 5,0, il compilatore supporta la matrice del membro nuovo e eliminazione operatori in una dichiarazione di classe.Di seguito è riportato un esempio:
// 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;
}