De l'utilité des "Set truc=Nothing" - VB/VBA/VBS - Programmation
Marsh Posté le 13-01-2004 à 16:27:35
le C++ est un langage de haut niveau egalement, il n'empeche qu'il faut tout de meme liberer les objets apres utilisation, en vb, c'est la meme chose, le Set MonObjet = nothing libere la memoire allouée à un objet. Sinon, en effet, implicitement VB libere l'objet lorsque l'on sort de son champs de visibilité (sortie de fonction ou procedure), mais ca, c'est la theorie , en pratique, il vaut mieux toujours liberer ce que l'on a alloué
Marsh Posté le 14-01-2004 à 13:32:02
Non, c'est à la fois inutile et erroné.
Set truc = Nothing ne s'applique qu'aux OBJETS, pas aux variables.
Deplus, si l'objet en question contient une méthode ".close" ou ".dispose", il faut l'éxécuter en premier.
Pour des variables de types "normaux" (nombres, chaînes de caractères, et array et structs contenant ces types) le nothing est inutile, puisqu'il est éxécuté au moment où la référence est supprimée. (l'affectation à Nothing éxécute le destructeur de l'objet, or les types "simples" n'ont pas de destructeur, donc c'est superflu)
Marsh Posté le 14-01-2004 à 13:36:42
MagicBuzz a écrit : Non, c'est à la fois inutile et erroné. |
il est totalement impossible de faire un Set ... = nothing sur autre chose qu'un objet, ce n'est donc pas superflux, mais tout simplement impossible (Vb hurle au blaspheme au moment meme ou tu effleure la touche F5 )
Marsh Posté le 14-01-2004 à 13:37:46
Ca dépends, si tu met pas "option explicit" au début, ça passe (en ASP et en VBS en tout cas, en VB chais pas, j'ai pas essayé )
Par contre, en ASP, je passe mes journée à virer ce genre de ligne du code parceque les stagiaires qui bossent avec moi c'est des gros gorets
Marsh Posté le 14-01-2004 à 13:43:39
MagicBuzz a écrit : Ca dépends, si tu met pas "option explicit" au début, ça passe (en ASP et en VBS en tout cas, en VB chais pas, j'ai pas essayé ) |
bha en VB, sans option explicit, n'importe quelle variables non declarée est implicitement declarée en tant que Variant et donc un objet, donc pas de pb.. mais quand on veut(doit !!!! ) faire propre, on declare tout, alors un set <variable_et_non_pas_objet> = <qquechose> ne marche pas
Ceci dit, en VB pure en effet
L'option Explicit c'est bon, mangez-en ! (comique de repetition inside )
Marsh Posté le 14-01-2004 à 13:55:30
En VBS/ASP, quand on met l'option explicit, on doit mettre un dim, mais on peut pas mettre de type, alors ça sert à rien
Marsh Posté le 15-01-2004 à 13:38:15
ixemul a écrit : le C++ est un langage de haut niveau egalement, il n'empeche qu'il faut tout de meme liberer les objets apres utilisation, en vb, c'est la meme chose, le Set MonObjet = nothing libere la memoire allouée à un objet. Sinon, en effet, implicitement VB libere l'objet lorsque l'on sort de son champs de visibilité (sortie de fonction ou procedure), mais ca, c'est la theorie , en pratique, il vaut mieux toujours liberer ce que l'on a alloué |
en pratique, faire "set MaVariable=nothing" à la fin d'une fonction ou dans un class_terminate est inutile, VB se démerde très bien tout seul
Marsh Posté le 15-01-2004 à 13:40:38
mareek a écrit : |
En pratique mais j'ai deja eu le cas d'objet ActiveX assez porcs pour poser problemes s'ils n'etaient pas libérés...
Marsh Posté le 15-01-2004 à 13:41:35
MagicBuzz a écrit : En VBS/ASP, quand on met l'option explicit, on doit mettre un dim, mais on peut pas mettre de type, alors ça sert à rien |
si, ça sert quand même.
Si tu fait une faute de frappe sur le nom de ta variable sans option explicit ("MaVariabIeDeLaMortQuiTue" au lieu de "MaVariableDeLaMortQuiTue" par ex.) VB va croire que c'est une nouvelle variable et tu va en chier comme un Russe pour débugger ton code.
Franchement, faire du VB sans option explicit c'est suicidaire
Marsh Posté le 15-01-2004 à 13:42:34
Sauf dans certains cas, avec des objets contenant eux-même d'autres objets assychrones (OLEDB par exemple). Parfois VB n'arrive pas à détruire tout seul l'objet, car il utilise un destructeur générique qui ne fait que désaouler les ressources de l'objet, mais pas les threads fils. Le destructeur explicite (appelé avec set xx = nothing) contient normalement l'appel aux méthodes de désalocation des ressources imbriquées.
Marsh Posté le 15-01-2004 à 13:44:08
MagicBuzz a écrit : Sauf dans certains cas, avec des objets contenant eux-même d'autres objets assychrones (OLEDB par exemple). Parfois VB n'arrive pas à détruire tout seul l'objet, car il utilise un destructeur générique qui ne fait que désaouler les ressources de l'objet, mais pas les threads fils. Le destructeur explicite (appelé avec set xx = nothing) contient normalement l'appel aux méthodes de désalocation des ressources imbriquées. |
OK
t'as des exemples précis d'objets qui posent problème ?
Marsh Posté le 15-01-2004 à 13:51:35
Le drivers ODBC pour Oracle livré avec la version 8.0.5 par exemple. Une fois sur deux, il va conserver la connection (ou pire, le recordset) ouvert en mémoire. Résultat, au bout de quelques heures d'utilisation, vous plantez la base qui est remplie de dead locks.
Marsh Posté le 15-01-2004 à 14:28:30
Dans les object models un peu touffus t'as intérêt à gérer finement la gestion des ressources (chez nous par exemple ).
Par exemple, je conseille fortement une fonction CleanUp avant de faire le Set Machin = Nothing histoire de ne pas avoir de surprise au moment du terminate lui-même.
De toute façon, mieux vaut ne jamais prendre le problème des ressources à la légère. Tu sais jamais dire à l'avance jusqu'à quel point ton projet est susceptible de gonfler.
Au pire si tu fais rien, ton application part en idle et reste en mémoire alors que tu voulais cliquer. Evitez si possible l'emploi du End
Marsh Posté le 15-01-2004 à 15:01:25
Disons que si on écrit proprement le destructeur, le Set machin = Nothing suffit. En effet, le destructeur est censé, avant de se terminer, vérifier que tout les traîtements assynchrones sont bien finis, et toutes les ressources libérées.
Par exemple, imaginons un objet qui contient un tableau d'objets, son destructeur devra ressembler à ça :
|
Marsh Posté le 13-01-2004 à 14:59:39
Je fai de l'ASP en VBScript.
j'ai recupere du code existant et a la fin de chaque fonction les variables qui étaient déclarées au debut par "dim truc" sont "effacées" a la fin de la fonction par "Set truc=nothing".
je me demandai si ct vraiment obligatoire ?? c'est censé être un langage de haut niveau, il fait pas le ménage lui même ?
Message édité par Profil supprimé le 13-01-2004 à 15:39:31