2010-11-05 3 views
18

ho trovato a dover scrivere del codice VBA di recente e chiedevo se qualcuno avesse mai incontrato alcun dettaglio su come funziona il garbage collector VBA? Il GC .Net è davvero ben documentato, ma non riesco a trovare un singolo frammento di dettaglio sul VBA GC, a parte il fatto che si tratta di un contatore di riferimento. Presumo che sia abbastanza simile al VC6 GC ma non riesco a trovare alcuna informazione su questo.VBA Garbage Collector Dettagli

In particolare, sarei interessato a sapere: (? È la raccolta generazionale, per esempio)

  • Che cosa fa scattare un GC
  • Che algoritmo che utilizza
  • Come (se non del tutto) fa gestisce riferimenti circolari?
  • C'è un modo di monitorare il suo funzionamento

Questo è più per curiosità che per qualsiasi esigenza particolare di conoscere, tutta la comprensione a tutti molto apprezzato!

+2

risposta di Konrad è tutto ciò che serve, ma io anche puntare a del VB programmatore Guida, in particolare la sezione "Modelli oggetto", che discute il conteggio di riferimento, "metodi teardown", e simili: http: // msdn.microsoft.com/en-us/library/aa263491(v=VS.60).aspx – jtolle

risposta

14

Quanto segue presuppone che VBA sia ancora utilizzando lo stesso meccanismo di garbage collection utilizzato in VB6 (cosa che molto probabilmente lo fa).

VB6 utilizzato un GC riferimento-conteggio. Il GC viene attivato deterministicamente quando l'ultimo riferimento a un dato oggetto è impostato su Nothing. L'impostazione dei riferimenti locali su Nothing non è necessaria, ciò accade quando non rientrano nell'ambito di applicazione.

Ogni oggetto implementa un'interfaccia COM che si prende cura del conte di riferimento per tale oggetto. Ogni assegnazione di un riferimento a un oggetto aggiorna i contatori di riferimento dei riferimenti coinvolti (cioè il contatore del vecchio oggetto a cui si faceva riferimento in precedenza viene decrementato e il contatore del nuovo oggetto viene incrementato). Un oggetto viene garbage raccolti quando il suo contatore di riferimento raggiunge 0.

oggetti nei riferimenti circolari sono quindi mai raccolti durante la vita di un'applicazione VBA. Inoltre, VBA non offre un modo per interrompere i riferimenti circolari. In VB6, i riferimenti deboli potrebbero essere implementati tramite le funzioni WinAPI.

+1

"L'impostazione di riferimenti locali a Nothing non è necessaria, questo accade quando si esce dal campo di applicazione." <- Questo dovrebbe essere tatuato all'interno di tutte le palpebre dello sviluppatore VBA/VB6! – Lunatik

+0

@ Lunatik - D'accordo !! Il numero di post che ho trovato durante la ricerca di informazioni GC che dicono "È la pratica migliore per impostare riferimenti a nulla" è davvero terrificante. –

+5

@ Jon: sfortunatamente, questa voce non è del tutto infondata. VB6 sembrava avere un bug che poteva causare alcuni riferimenti penzolanti nelle variabili dei membri della classe (non le variabili locali però). Non so se la fonte esatta di questo bug sia stata mai rintracciata, ma è diventata una pratica consolidata utilizzare il metodo 'Class_Terminate' per impostare tutti i membri su' Nothing'. –