ProgrammazioneSviluppatore Backend

Spiega come funziona il sistema di possesso (ownership) in Rust e come garantisce la sicurezza della memoria senza garbage collector?

Supera i colloqui con l'assistente IA Hintsage

Risposta

Il sistema di possesso (ownership) è il concetto principale di Rust per garantire la sicurezza della memoria a livello di compilazione. Ogni variabile ha un proprietario. Solo un proprietario di una risorsa può esistere in un dato momento.

Il possesso viene trasferito (move) durante l'assegnazione o la trasmissione a una funzione. Dopo il trasferimento, il precedente proprietario non può utilizzare il valore:

let s = String::from("hello"); let t = s; // s non è più accessibile

Rust distingue anche per il prestito (references).

  • &T — reference di sola lettura (borrow).
  • &mut T — reference mutabile (mutable borrow), ma solo una può esistere in un dato periodo di vita.

Grazie a queste regole, Rust garantisce che non ci siano condizioni di gara con dati utilizzati dopo il rilascio della memoria e altri errori nella gestione delle risorse.

Domanda trabocchetto

Può esserci più di un reference mutabile (&mut T) contemporaneamente per un valore? Perché?

Risposta: No, in ogni momento può esserci un numero qualsiasi di reference immutabili o solo una reference mutabile. Questo previene le condizioni di gara. Esempio di codice errato:

let mut s = String::from("hi"); let r1 = &mut s; let r2 = &mut s; // errore di compilazione!

Esempi di errori reali dovuti alla mancanza di conoscenza delle sottigliezze dell'argomento


Storia

In un progetto multithreading, uno sviluppatore cercava di mantenere le reference a un buffer mutabile senza utilizzare il possesso, il che portava a crash (use-after-free) quando il buffer veniva liberato prima che il lavoro con la reference fosse completato. Rust non ha permesso di compilare tale codice, quindi è stata necessaria una modifica dell'architettura.


Storia

All'inizio di un grande progetto Rust, i programmatori migravano codice da C++. Cercavano di combinare abitudini obsolete di lavoro con puntatori "grezzi", il che portava a errori di possesso delle risorse e continue paniche del borrow checker, finché non è stata risolta la problematica architettonica del possesso.


Storia

Nella libreria di parsing delle stringhe, gli errori di doppia liberazione della memoria sono stati evitati solo grazie al rigoroso sistema di possesso di Rust. Una libreria simile in C++ portava a bug difficili da individuare e perdite di memoria.