à propos de la fonction Class_Terminate
Bonjour, lorsque l'on crée un module de classe, il faut toujours créer les fonctions Class_Initialize (que j'assimile à un constructeur par défaut) et Class_Terminate (que j'assimile au destructeur de la classe). J'ai fait pas mal de C++ donc j'utilise ce vocabulaire.
Dans des tutoriels, je lis très souvent qu'après chaque "new" il faut faire un libérer la mémoire (en gros set mon_truc = nothing).
J'ai une classe qui contient pas mal de dictionnaires, de "new" vers d'autres classes etc..., du coup mon destructeur ressemble à ceci :
Code:
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
'destructeur
Private Sub Class_Terminate()
Dim usine As Variant
Dim pvt As Variant
Dim cad As Variant
Dim nomMoule As Variant
Dim cai As Variant
Dim indicePP04 As Variant
Set wb_ = Nothing
Set ws_ = Nothing
'destruction de l'attribut planProd_
For Each usine In planProd_.keys
For Each pvt In planProd_(usine).keys
For Each cad In planProd_(usine)(pvt).keys
Set planProd_(usine)(pvt)(cad) = Nothing
Next cad
Set planProd_(usine)(pvt) = Nothing
Next pvt
Set planProd_(usine) = Nothing
Next usine
Set planProd_ = Nothing
'destruction de l'attribut tonnageAvantPIPO_
For Each usine In tonnageAvantPIPO_.keys
Set tonnageAvantPIPO_(usine) = Nothing
Next usine
Set tonnageAvantPIPO_ = Nothing
'destruction de l'attribut dicoNbMoules_
For Each usine In dicoNbMoules_.keys
Set dicoNbMoules_(usine) = Nothing
Next usine
Set dicoNbMoules_ = Nothing
'destruction de l'attribut dicoComplementNbMoules_
For Each usine In dicoComplementNbMoules_.keys
For Each nomMoule In dicoComplementNbMoules_(usine).keys
Set dicoComplementNbMoules_(usine)(nomMoule) = Nothing
Next nomMoule
Set dicoComplementNbMoules_(usine) = Nothing
Next usine
Set dicoComplementNbMoules_ = Nothing
'destruction de l'attribut dicoChargeMoules_
For Each usine In dicoChargeMoules_.keys
For Each nomMoule In dicoChargeMoules_(usine).keys
Set dicoChargeMoules_(usine)(nomMoule) = Nothing
Next nomMoule
Set dicoChargeMoules_(usine) = Nothing
Next usine
Set dicoChargeMoules_ = Nothing
'destruction de l'attribut dicoComplementCapaMoule_
For Each usine In dicoComplementCapaMoule_.keys
For Each cai In dicoComplementCapaMoule_(usine)
Set dicoComplementCapaMoule_(usine)(cai) = Nothing
Next cai
Set dicoComplementCapaMoule_(usine) = Nothing
Next usine
Set dicoComplementCapaMoule_ = Nothing
'destruction de l'attribut planProdIndicePP04_
For Each usine In planProdIndicePP04_.keys
For Each cad In planProdIndicePP04_(usine).keys
For Each indicePP04 In planProdIndicePP04_(usine)(cad).keys
Set planProdIndicePP04_(usine)(cad)(indicePP04) = Nothing
Next indicePP04
Set planProdIndicePP04_(usine)(cad) = Nothing
Next cad
Set planProdIndicePP04_(usine) = Nothing
Next usine
Set planProdIndicePP04_ = Nothing
End Sub |
Si je mets tout ce code en commentaire, je m'aperçois que les autres fonctions Class_Terminate sont quand même appelées. A quoi bon se "fatiguer" à coder un tel destructeur ? De plus, puis-je le raccourcir de la manière suivante :
Code:
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
|
'destructeur
Private Sub Class_Terminate()
Set wb_ = Nothing
Set ws_ = Nothing
'destruction de l'attribut planProd_
Set planProd_ = Nothing
'destruction de l'attribut tonnageAvantPIPO_
Set tonnageAvantPIPO_ = Nothing
'destruction de l'attribut dicoNbMoules_
Set dicoNbMoules_ = Nothing
'destruction de l'attribut dicoComplementNbMoules_
Set dicoComplementNbMoules_ = Nothing
'destruction de l'attribut dicoChargeMoules_
Set dicoChargeMoules_ = Nothing
'destruction de l'attribut dicoComplementCapaMoule_
Set dicoComplementCapaMoule_ = Nothing
'destruction de l'attribut planProdIndicePP04_
Set planProdIndicePP04_ = Nothing
End Sub |
Y a-t-il un risque que la mémoire ne soit pas totalement libérée (donc qu'un "pointeur" ne soit pas remis à nothing (ou NULL en C++)) ?
Merci bcp
Bonne journée