Bonjour,
J'ai implémenté une classe en VB6 qui s'appelle Vector et agit comme la classe C++ de la STL.
Afin d'obtenir des bonnes performances, j'utilise l'allocation et la réallocation directe de mémoire. Cela fonction très bien avec les types de base et les strings, mais mon programme plante lorsque j'essaie avec des objets.
Le programme test qui plante systématiquement est le suivant: j'ai un premier vecteur v auquel je viens concaténer un second vecteur v2 qui lui contient un unique élément, 12.
Je stocke les informations par référence dans v, pour un objet voici ce qui est écrit (version très simplifiée de la fonction):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Declare Sub copyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long) Private Sub test() Dim v As New Vector ' Concatène un vector après celui-là test2 v Debug.Print v.toString() end sub Private Sub test2(v As Vector) Dim v2 As New Vector v2.pushElement 12 v.pushElement v2 End Sub
et je récupère ces informations ensuite avec getElement, qui est appelée dans toString():
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Public Sub pushElement(ByRef v As Variant) ptr = ObjPtr(v) copyMemory m_pointers, ptr, 4 end sub
Le débugueur m'indique que le problème semble venir du fait qu'à la fin de test2, le garbage collector vient libérer l'espace mémoire occupé par v2, rendant son accès impossible par la suite - lapalissade.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Public Function getElement(i As Long) As Variant dim p as long copyMemory p, m_pointers, 4 Dim oClone As Object copyMemory oClone, p, 4 Set getElement = oClone copyMemory oClone, 0&, 4 end function
Il agit ainsi parce qu'il a constaté qu'aucune variable ne venait utiliser v2, et que donc il pouvait m'en débarasser. Si je lance le programme avec test2 qui renvoie v2 et qui est affecté dans test me confirme que le garbage collector est responsable.
Comment puis-je faire pour 1/ le désactiver ou 2/ qu'il considère que ce vecteur est utilisé ailleurs et qu'il ne le libère pas?
Merci
Partager