Sous VB la gestion des objects passe par un compteur de référence qui s'incrémente
ou se décrémente automatiquement en fonction de la durée de vie de l'object -
la durée de vie de l'object est liée
- soit à la copie de l'object
- soit au déférencement par l'utilisation d'une affectation à Nothing de l'object
- soit à la sortie de la portée de l'object
La gestion des pointeurs sous VB permet de lire ce compteur qui se situe à l'offset+3,
ce qui peut être utile pour identifier les objects non déférencés.
Exemple:
' 1 Formulaire AutoRedraw:true - 3 commandbuttons à utiliser dans l'ordre de création en mode Runtime
' Dans un ModuleCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 Private Sub Command1_Click() Me.Cls oPtr = ObjPtr(obj1) ' Adresse de l'object initial Me.Print "Le compteur est initialisé à la création de l'object et conservé suivant sa portée" Me.Print vbTab & "Object initial => " & GetCounter() End Sub Private Sub Command2_Click() Dim obj2 As Object Set obj2 = obj1 Me.Print "Une copie est ajoutée" Me.Print vbTab & "Ajout d'une référence locale => " & GetCounter() End Sub Private Sub Command3_Click() Dim obj2 As Object Me.Print "Dès la sortie de la portée de Obj2 dans Command2 : " Me.Print vbTab & "Le compteur a été automatiquement décrémenté => " & GetCounter() Me.Print Me.Print "Une copie est à nouveau ajoutée" Set obj2 = obj1 Me.Print vbTab & "Ajout d'une référence locale => " & GetCounter() Me.Print "La copie est déférencée par l'utilisation de Nothing" Set obj2 = Nothing Me.Print vbTab & "Le compteur est à nouveau décrémenté => " & GetCounter() End Sub Private Sub Form_Terminate() MsgBox "dans Form_Terminate => " & GetCounter() & vbCrLf & "L'object n'est toujours pas détruit !" Debug.Print GetCounter() End Sub
Dans la fenêtre d'Exécution, on exécuteCode:
1
2
3
4
5
6
7
8 Public Declare Sub GetMem4 Lib "MSVBVM60.DLL" (ByVal inSrc As Any, inDst As Long) Public obj1 As New Collection Public oPtr As Long Public Function GetCounter(Optional Adr As Long = 0) As Long If Adr = 0 Then Adr = oPtr + (3 * 4) If Adr <> 0 Then GetMem4 Adr, GetCounter End Function
en remplacant 'xxxxxx' par le handle du compteur qui a été retourné à la fermeture du formulaire ...Code:? GetCounter(CLng(xxxxxx))
Le compteur a bien été décrémenté en fin d'exécution.