MEC++: new e delete

Appunti tratti dalla rilettura di More Effective C++ di Scott Meyers. Secondo blocco: Operatori.

(8) I diversi significati di new e delete

Quando si parla di "new operator" si intende l'operatore che non può essere sottoposto ad overloading e che viene utilizzato al momento della creazione di un oggetto sull'heap, come in questo caso:

string* ps = new string("Memory Management");

Il "new operator" alloca memoria per l'oggetto e chiama il costruttore per inizializzare l'oggetto nel blocco di memoria che é stato allocato.

L'"operator new" é l'operatore che viene chiamato (implicitamente da "new operator") per allocare memoria. Non é comune chiamare l'"operator new" direttamente ma nel caso, lo si chiama in questo modo:

void* rawMemory = operator new(sizeof(string));

In questo caso ritorna un blocco di memoria, della dimensione di un oggetto della classe string. Si occupa solo di allocare la memoria, non ha niente a che vedere con il costruttore dell'oggetto.

Il "placement new" é l'operatore che ci permette di invocare il costruttore per un oggetto dato un blocco di memoria precedentemente allocato. Lo si chiama in questo modo:

new (buffer) MyClass();

Dove buffer é un puntatore all'area di memoria precedentemente allocata.

La chiamata a delete permette di deallocare la memoria precedentemente riservata all'oggetto in questione, e di chiamare il distruttore su di esso.

Se si usa "operator new" per allocare memoria senza richiamare il ctor, occorrerà usare operator delete per deallocarla, senza chiamare il dtor.

Se si usa il "placement new" occorrerà chiamare delete sull'oggetto e poi, esplicitamente, il dtor.

Infine occorre ricordarsi che quando si allocano array con new [], occorre liberare la memoria con delete [].

Nessun commento:

Posta un commento