Linguaggio C++

Libreria New

Uso dell operatore new in C++ per l allocazione dinamica della memoria. Differenze con le variabili normali, gestione con delete e laboratorio guidato.

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;

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_ptr
  • shared_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.


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[].