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 garbage collection a causa della sua associazione con l'oggetto. Questo tipo di riferimento viene comunemente utilizzato per aiutare a eliminare le perdite di memoria in presenza di condizioni speciali che impediscono la normale raccolta dei rifiuti. Gli algoritmi di programmazione che utilizzano un riferimento circolare o contengono informazioni estranee in una cache o in una struttura speciale traggono vantaggio dall'uso di riferimenti deboli. L'utilizzo di riferimenti deboli in questi tipi di situazioni consente la pulizia di oggetti referenti inutilizzati e dei riferimenti deboli associati.
Nella programmazione per computer, un riferimento sicuro viene in genere creato per impostazione predefinita quando viene creato un oggetto e la memoria occupata dall'oggetto rimane allocata fintanto che 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 alcune situazioni, come la programmazione socket o le applicazioni di manipolazione delle immagini, le classi utilizzate per creare oggetti di lavoro non hanno la capacità integrata di archiviare informazioni aggiuntive richieste da un'applicazione specifica. I dettagli aggiuntivi per oggetti transitori come connessioni o immagini devono essere memorizzati in oggetti cache supplementari e collegati agli oggetti transitori mediante riferimenti. Quando viene utilizzato un riferimento debole anziché un riferimento forte, le informazioni extra non sono vincolate dal riferimento e possono essere rimosse dalla cache dal Garbage Collector dopo che l'oggetto referente è stato contrassegnato come non praticabile.
Le classi di riferimento deboli sono normalmente disponibili in lingue che sono aumentate dai sottosistemi Garbage Collection, inclusi Java, Python, Perl, C # e .NET framework. In C ++, tuttavia, i programmatori sono in genere responsabili di garantire la pulizia della memoria. Questo linguaggio ha implementato una classe di puntatori intelligenti che fornisce alcune delle stesse funzionalità fornite da riferimenti deboli e garbage collection, contribuendo a ridurre le perdite di memoria causate da una pulizia impropria del puntatore.
Per facilitare ulteriormente la gestione della memoria, le lingue con funzionalità di garbage collection possono inoltre migliorare la funzionalità di una lingua fornendo gradienti più fini di riferimenti diversi dal riferimento forte o debole. Tipi di dati come riferimenti software e riferimenti fantasma possono essere inclusi in questi linguaggi, il che consente di variare i livelli di recupero degli oggetti o di notifica della deallocazione. I programmatori che usano le lingue con la garbage collection automatica dovrebbero familiarizzare con tutte le classi di riferimento disponibili al fine di migliorare le prestazioni dell'applicazione.