Condividi tramite


Funzione operator new

Quando un'istruzione come la seguente viene rilevata in un programma, viene convertita in una chiamata alla funzione operator new:

Note

char *pch = new char[BUFFER_SIZE];

Se la richiesta è per i byte zero di archiviazione, operator new restituisce un puntatore a un oggetto distinto (ovvero chiamate ripetute a puntatori diversi di ritorno operator new ). Se la memoria disponibile non è sufficiente per la richiesta di allocazione, operator new restituisce NULL o genera un'eccezione (vedere Gli operatori new e delete per ulteriori informazioni).

È possibile scrivere una routine che tenta di liberare memoria e riprovate l'allocazione; vedere _set_new_handler per ulteriori informazioni. Per ulteriori informazioni sulla combinazione di aggiornamento, vedere il seguente argomento, Gestire gli stati di memoria insufficiente.

I due ambiti delle funzioni operator new sono descritti nella tabella seguente.

Ambito per le funzioni operator new

Operatore

Ambito

::operator new

Global

class-name::operator new

Classe

Il primo argomento di operator new deve essere di tipo size_t (un tipo definito da STDDEF.H) e il tipo restituito è sempre void *.

La funzione globale operator new viene chiamata quando l'operatore new viene utilizzato per allocare oggetti di tipi incorporati, gli oggetti di tipo classe che non contengono funzioni operator new definite dall'utente e matrici di qualsiasi tipo. Quando l'operatore new viene utilizzato per allocare oggetti di un tipo di classe in cui viene definito operator new , viene chiamato operator new di tale classe.

Una funzione operator new definita per una classe è una funzione membro statico (che non può, pertanto, essere virtuale) che nasconde la funzione globale operator new degli oggetti di tale tipo di classe. Si consideri il caso in cui new 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 new viene passato a Blanks::operator new come argomento chInit. Tuttavia, la funzione globale operator new è nascosta, in questo modo il codice seguente genera un errore:

Blanks *SomeBlanks = new Blanks;

In Visual C++ 5.0 e nelle versioni precedenti, i tipi nonclass e tutte le matrici (indipendentemente dal fatto che costituiscono il tipo class) allocati mediante l'operatore new utilizzano sempre la funzione globale operator new.

A partire da Visual C++ 5.0, il compilatore supporta gli operatori new e delete della matrice di membro in una dichiarazione di classe. Ad 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;
}

Vedere anche

Riferimenti

Funzione operator delete

Operatore new (C++)

Operatore delete (C++)