L operatore new in C++ serve per creare variabili e array dinamicamente nello heap. Questo significa che la memoria viene allocata durante l esecuzione del programma, non a compile-time come con le variabili normali.
L uso di new richiede sempre la corrispondente delete per evitare memory leak.
1️⃣ Variabili normali vs memoria dinamica
Una variabile normale viene allocata nello stack:
int x = 5; // memoria automatica (stack)
Una variabile dinamica viene allocata nello heap usando new:
int* p = new int; // memoria dinamica (heap)
*p = 5;
2️⃣ Allocazione dinamica di variabili
int* p = new int; // crea un int nello heap
*p = 10;
cout << *p; // stampa 10
Oppure con inizializzazione immediata:
int* p = new int(20);
3️⃣ Liberare memoria con delete
Quando una memoria viene creata con new, deve essere liberata con delete.
int* p = new int(10);
delete p; // libera lo heap
p = nullptr;
delete → memory leak.
4️⃣ Allocare array dinamici
int* v = new int[5]; // array dinamico
for(int i = 0; i < 5; i++)
v[i] = i * 10;
Per liberare un array dinamico serve delete[]:
delete[] v;
v = nullptr;
5️⃣ new e struct/class
struct Persona {
string nome;
int eta;
};
Persona* p = new Persona{"Mario", 30};
cout << p->nome;
delete p;
6️⃣ Perché usare new?
- dimensioni determinate a runtime
- memoria che deve sopravvivere fuori da una funzione
- strutture dati dinamiche (liste, alberi, grafi)
7️⃣ Perché evitare new quando possibile?
- richiede gestione manuale (delete)
- rischio di memory leak
- rischio di dangling pointer
- più lento dello stack
8️⃣ Il sostituto moderno: smart pointer
La libreria <memory> offre:
unique_ptrshared_ptr
che rendono spesso inutile l uso diretto di new.
9️⃣ Esempio completo
int* p = new int(7);
cout << "Valore: " << *p << endl;
cout << "Indirizzo: " << p << endl;
delete p;
p = nullptr;
LABORATORIO
Uso dell Operatore new
In questo laboratorio imparerai a creare memoria dinamica,
gestire variabili dinamiche, array e liberare correttamente lo heap
usando new e delete.
- Puntatori
- Operatore
newedelete - Allocazione dinamica
1 Creare un intero dinamico
int* p = new int;
*p = 15;
cout << *p;
delete p;
2 Inizializzazione dinamica
int* p = new int(99);
cout << *p;
delete p;
3 Array dinamico
int* v = new int[5];
for(int i=0; i<5; i++)
v[i] = i * 2;
delete[] v;
4 Strutture dinamiche
struct Punto { int x, y; };
Punto* p = new Punto{3, 4};
cout << p->x;
delete p;
5 Esercizi
- Alloca un array dinamico di 100 elementi e riempilo con numeri casuali.
- Crea dinamicamente un oggetto Persona con nome e età.
- Implementa una funzione che crea e restituisce un array dinamico di N elementi.
- Simula un vettore dinamico con crescite manuali tramite new[] e delete[].