Est compensation objet / tableau désallocation vraiment nécessaire dans VB6 / VBA (avantages / inconvénients?)

StackOverflow https://stackoverflow.com/questions/1525772

  •  20-09-2019
  •  | 
  •  

Question

Beaucoup de ce que j'ai appris VB j'appris d'utiliser l'analyse statique de code (en particulier Project Analyzer de Aivosto). Et une une des choses qu'il vérifie si oui ou non vous avez effacé tous les objets et les tableaux. Je faisais juste ce aveuglément parce que PA a dit. Mais maintenant que je connais un peu plus sur la façon dont les ressources libère VB, il me semble que ces choses devraient se dérouler automatiquement. Est-ce une caractéristique héritée de la pré VB6, ou est-il une raison pour laquelle vous devez définir explicitement les objets revenir à rien et utiliser Erase sur les tableaux?

Était-ce utile?

La solution

Le problème, si je comprends bien, a à voir avec le fait que VB6 (et ses prédécesseurs) a ses racines dans COM, et son système de collecte des ordures référence de comptage.

Imaginez, par exemple, que vous déclarez un refernece à un objet d'une bibliothèque 3ème partie. Cet objet a un compte de référence COM qui est utilisé à la fois pour le maintenir en vie et de déterminer quand il doit être détruit. Il ne détruit lorsque vous définissez à rien, mais quand le compteur de référence de l'objet atteint zéro.

Maintenant, tous les composants COM ont été écrits en Visual Basic. Certains ont été écrits en C ou C ++. Gestion structurée des exceptions n'existait pas dans toutes les langues. Donc, si une erreur est survenue, le compte de référence sur l'objet n'a pas été assuré d'être correctement réduite, et les objets COM étaient connus pour traîner plus longtemps qu'ils étaient destinés à. Ce ne fut pas un problème avec Visual Basic, en tant que tel. Il était un problème COM. (Et cela, vous pourriez noter, est pourquoi .NET n'utilise pas de comptage de référence.)

C'est pourquoi les développeurs Visual Basic sont devenus obsédés par la libération des références de l'objet avant de sortir des routines. Vous ne savez tout simplement pas ce qu'est un composant allouons crée sous le capot. Mais lorsque vous relâchez votre référence à, vous êtes au moins libérer votre compte de référence. Il est devenu presque un mantra religieux. Déclarer, utiliser, relâchez. Ce fut la façon COM de faire les choses.

Bien sûr, peut-être meilleur ou plus rapide Visual Basic à des variables déréférencement je déclarai sur la pile. Mais bon sang, je veux que ce soit clair que ces objets ont été libérés. Un peu d'assurance va un long chemin quand vous essayez de traquer une fuite de mémoire.

Autres conseils

Matt Courlande, auteur de Visual Basic 6 Avancé , qui sait plus sur Visual Basic que la plupart d'entre nous ne le fera jamais, pense qu'il est un effort inutile. Considérez cette citation (P110) à propos de DAO, la bibliothèque d'accès aux données COM qui vise principalement la base de données d'accès du moteur:

  

un autre exemple de mauvaise code désassemblage.   DAO a des méthodes qui doivent être Close   appelé dans le bon ordre et la   les objets doivent être libérés dans le   ordre aussi bien (Recordset   avant la base de données, par exemple). Cette   comportement modèle unique objet pauvre a   conduit à l'idée fausse que les fuites VB   mémoire à moins que vous définissez explicitement tous   les variables locales à rien au   fin d'une fonction. C'est un   notion complètement faux dans un   modèle d'objet bien conçu. VB peut   effacer les variables plus rapidement à la fin   ligne sous que vous pouvez à partir du code, et   il vérifie les variables même si vous   libérer explicitement vos références.   Tout effort que vous faites est dupliqué.

Avez-vous lu cette Aivosto page web (par les créateurs de Project Analyzer)?

  

Si vous utilisez des variables statiques,   il est important de récupérer la mémoire   ils occupaient lorsque vous n'avez pas besoin   des variables plus. avec dynamique   la mémoire des variables n'est pas tant d'un   problème, car ils sont détruits   lorsque la procédure se termine.

En d'autres termes, vous n'avez pas à vous soucier de compensation ordinaires, non statiques, variables locales.

Je le fais toujours pour les bonnes pratiques, on ne sait jamais ce qu'une exception pourrait faire si vous tombez dans un seul et vos objets ne sont pas DEALLOCATED. Vous devriez les relase dans finally et veiller à ce qu'ils n'utilisent pas de mémoire, sinon vous risquez de rencontrer une fuite de mémoire.

J'ai eu un problème à l'intérieur d'un temps simple, hors système de suivi où le serveur a gardé le plantage au hasard, il a fallu des semaines pour déterminer c'était une fuite de mémoire d'un objet qui était censé autodétruire lui-même. Mon code était jeté dans une exception et jamais nettoyée après lui-même provoque le serveur (le site Web réel pas l'ensemble du serveur) pour aller vers le bas.

Oui, mettre tous les objets à rien et nettoyer autant que vous le pouvez. VB6 est bien connu pour avoir des fuites de mémoire lorsqu'ils ne sont pas nettoyer vos trucs. Collecte des ordures ménagères a été sous-par dans VB6 / VBA.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top