C++ New

Da Andreabont's Wiki.

New è una parola chiave del C++ utilizzata per allocare nuova memoria nell'heap, restituendo un indirizzo alla zona di memoria appena allocata (è indipendente quindi dallo scope). E' logicamente equivalente al malloc del C, anche se porta delle differenze rivolte alla programmazione ad oggetti.

Una mancata allocazione della memoria provoca il lancio dell'eccezione std::bad_alloc.

Da notare che questo è uno dei due modi del C++ per dichiarare le variabili, l'altro metodo è quello classico che utilizza lo stack, ed è dipendente dallo scope.

Allocare memoria

Singolo

La sintassi base per allocare una variabile/oggetto di tipo miotipo è:

miotipo *p_miotipo = new miotipo;

Se volessi inizializzare la mia variabile/oggetto (vedi costruttore) la sintassi da usare è:

miotipo *p_miotipo = new miotipo(valore/i);

Array

Posso allorare anche un array di variabili/oggetti di tipo miotipo con la seguente sintassi:

miotipo *p_miotipo = new miotipo[dimensione];

Se volessi inizializzare l'array appena creato la sintassi da usare è:

miotipo *p_miotipo = new miotipo[dimensione] {valore, valore, valore ...};

In un buffer preallocato

Con la tecnica del placement new è possibile chiedere all'operatore new di istanziare la memoria in un buffer allocato precedentemente.

char *buf = new char[100];
miotipo *p_miotipo = new (buf) miotipo;

Deallorare la memoria

Il C++ non fornisce una gestione automatica della memoria, se non tramite alcuni puntatori della libreria standard. In linea di massima dopo aver allocato della memoria bisogna deallocarla nel momento in cui si smette di usarla. (per gli oggetti vedi distruttore)

Singolo

delete p_miotipo;

Array

delete[] p_miotipo;

Overload dell'operatore new e delete

Gli operatori new e delete possono essere definiti custom dal programmatore, che può scegliere di definirli globalmente, oppure di definirli per un oggetto specifico (in quel caso vanno definiti statici). Una esempio di uso di questa tecnica è possibile vederlo nel Boehm garbage collector.

// NEW
void* operator new(std::size_t n) {
    // Alloco n byte
    void* puntatore = malloc(n);
    return puntatore;
}

// DELETE
void operator delete(void* puntatore) throw() {
    // Dealloco puntatore
    free(puntatore);
}