Che cos’è un riferimento debole?

Un riferimento debole è un riferimento a un oggetto in memoria che non impedisce a un oggetto di essere ripulito dalle routine di raccolta dei rifiuti a causa della sua associazione con l’oggetto. Questo tipo di riferimento è comunemente usato per aiutare a eliminare le perdite di memoria quando esistono condizioni speciali che impediscono il normale Garbage Collection. Gli algoritmi di programmazione che utilizzano un riferimento circolare o conservano informazioni estranee in una cache o in una struttura speciale traggono vantaggio dall’utilizzo di riferimenti deboli. L’utilizzo di riferimenti deboli in questi tipi di situazioni consente la pulizia degli oggetti referenti inutilizzati e dei relativi riferimenti deboli associati.

Nella programmazione del computer, un riferimento forte viene in genere creato per impostazione predefinita quando viene creato un oggetto e la memoria occupata dall’oggetto rimane allocata finché il riferimento forte rimane praticabile. Un riferimento forte viene annullato e la memoria del suo oggetto associato viene liberata poco dopo un riferimento forte e il suo oggetto viene contrassegnato come non più utilizzato da un programma. In determinate situazioni, come la programmazione di socket o le applicazioni di manipolazione delle immagini, le classi utilizzate per creare oggetti di lavoro non hanno la capacità incorporata di memorizzare informazioni aggiuntive richieste da un’applicazione specifica. I dettagli aggiuntivi per oggetti transitori come connessioni o immagini devono essere archiviati in oggetti cache supplementari e collegati agli oggetti transitori tramite riferimenti. Quando viene utilizzato un riferimento debole invece di un riferimento forte, le informazioni aggiuntive non sono vincolate dal riferimento e possono essere rimosse dalla cache dal Garbage Collector una volta che l’oggetto referente è stato contrassegnato come non valido.

Le classi di riferimento deboli sono normalmente disponibili nei linguaggi potenziati dai sottosistemi di raccolta dei rifiuti, inclusi Java, Python, Perl, C# e il framework .NET. In C++, tuttavia, i programmatori sono generalmente responsabili della pulizia della memoria. Questo linguaggio ha implementato una classe puntatore intelligente che fornisce alcune delle stesse funzionalità fornite dai riferimenti deboli e dalla raccolta di rifiuti, contribuendo a ridurre le perdite di memoria causate da una pulizia impropria del puntatore.

Per facilitare ulteriormente la gestione della memoria, i linguaggi con funzionalità di raccolta dei rifiuti possono inoltre migliorare la funzionalità di un linguaggio fornendo gradienti più fini di riferimenti diversi dal riferimento forte o debole. I tipi di dati come i riferimenti software e i riferimenti fantasma possono essere inclusi in questi linguaggi, il che consente diversi livelli di riacquisizione degli oggetti o notifica di deallocazione. I programmatori che utilizzano linguaggi con Garbage Collection automatizzato dovrebbero familiarizzare con tutte le classi di riferimento disponibili per migliorare le prestazioni dell’applicazione.