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
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 un Module
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 |
Dans la fenêtre d'Exécution, on exécute
? GetCounter(CLng(xxxxxx))
en remplacant 'xxxxxx' par le handle du compteur qui a été retourné à la fermeture du formulaire ...
Le compteur a bien été décrémenté en fin d'exécution.
Partager