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 :
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 : 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
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
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++)) ?
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
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
Merci bcp
Bonne journée
Partager