Funzionamento di new
L'elemento allocation-expression, che contiene l'operatore new, effettua tre operazioni:
Individua e riserva uno spazio di archiviazione per l'oggetto o gli oggetti da allocare. Una volta completata questa fase, la quantità corretta di spazio di archiviazione viene allocata, ma non è ancora un oggetto.
Inizializza l'oggetto/gli oggetti. Una volta che l'inizializzazione è stata completata, vi sono informazioni sufficienti affinché l'archiviazione allocata sia un oggetto.
Restituisce un puntatore all'oggetto o agli oggetti di un tipo di puntatore derivato da new-type-name o da type-name. Il programma utilizza questo puntatore per accedere all'oggetto appena allocato.
L'operatore new richiama la funzione operator new. Per le matrici di qualsiasi tipo e per gli oggetti che non appartengono a tipi class, struct o union, una funzione globale, ::operator new viene chiamata per allocare lo spazio di archiviazione. Gli oggetti di tipo di classe possono definire la propria funzione membro statico operator new in base alle classi.
Quando il compilatore rileva l'operatore new per allocare un oggetto di tipo type, genera una chiamata a type**::operator new( sizeof(** type ) ) oppure, se non vi è nessun operator new definito dall'utente, ::operator new( sizeof( type ) ). Di conseguenza, l'operatore new è in grado di allocare la quantità di memoria corretta per l'oggetto.
Nota
L'argomento a operator new è di tipo size_t.Questo tipo è definito in DIRECT.H, MALLOC.H, MEMORY.H, SEARCH.H, STDDEF.H, STDIO.H, STDLIB.H, STRING.H e TIME.H.
Un'opzione nella grammatica consente la specifica di placement (vedere la grammatica per Operatore new). Il parametro placement può essere utilizzato solo per le implementazioni definite dall'utente operator new; consente di passare informazioni aggiuntive a operator new. Un'espressione con un campo placement come T *TObject = new ( 0x0040 ) T; viene convertita in T *TObject = T::operator new( sizeof( T ), 0x0040 ); se la classe T dispone dell'operatore membro new, in caso contrario in T *TObject = ::operator new( sizeof( T ), 0x0040 );.
Lo scopo originale del campo placement era di consentire agli oggetti hardware dipendenti di essere allocati in indirizzi specificati dall'utente.
Nota
Sebbene nell'esempio precedente venga illustrato un solo argomento nel campo placement, non vi è alcuna restrizione sul numero di argomenti aggiuntivi che è possibile passare a operator new in questo modo.
Anche se è stato definito operator new per un tipo di classe, l'operatore globale può essere utilizzato tramite il formato dell'esempio seguente:
T *TObject =::new TObject;
Con l'operatore di risoluzione dell'ambito (::) si impone l'utilizzo dell'operatore globale new.