Objets et references

[Résolu]
Signaler
Messages postés
102
Date d'inscription
lundi 29 décembre 2003
Statut
Membre
Dernière intervention
28 juin 2007
-
Messages postés
102
Date d'inscription
lundi 29 décembre 2003
Statut
Membre
Dernière intervention
28 juin 2007
-
bonjour,

j'ai besoin que quelqu'un confirme mon idée.

je créée un objet collection de nom "Employes"
les objets de la collection sont des objets nommés "employe"
à chaque objet de la collection, je définis une propriété parent contenant une référence à l'objet "Employes"

je detruis la collection: set Employes=nothing

je ne peux plus accéder aux objets de la collection "employe" bien qu'ils existent encore ?

Vrai ?

deuxième question: les objets non détruits restent-ils en mémoire après fermeture de l'application? y a-t-il un risque de baisse des performances du système (fuite de memoire) ?

merci de vos réponses

monsieurlémouche

6 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Ne pas confondre Collection et Objets dans la Collection.

Une collection ne fait que rassembler des références vers des objets existant indépendament d'elle. En aucun cas elle ne contient les objets eux-même.

Comparons tout ça à un livre. Tes objets seraient les pages du livre, la collection serait la table des matières.

La table des atières ne contient pas les pages du livre, elle ne contient que des références vers les pages. De detruire la table des matière, ne détruit pas les pages elles-mêmes. De même, de détruire une page, ne détruit pas la référence vers cette page dans la table des matières, référence désormais érronée uisque la page n'existe plus.

Le fonctionnement est le même pour les collections.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
102
Date d'inscription
lundi 29 décembre 2003
Statut
Membre
Dernière intervention
28 juin 2007

suite de mon questionnement.

y a un truc que je ne pige pas!

vb ne détruit pas l'objet tant qu'il existe au moins une référence pointant vers celui-ci. Donc, en faisant set Employes=nothing, je ne détruis pas l'objet car les objets de la collections (objets enfants si on veut) contiennent des références pointant vers lui (le parent).

Donc, s'il n'est pas détruit, pourquoi n'est-il plus possible d'accéder aux objets de la collection.

serait-il dans un état quantique? entre le vivant et le détruit?

merci de m'apporter vos lumières

monsieurlémouche
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
Tu as bien raison :

"ne détruit pas l'objet tant qu'il existe au moins une référence vers celui-ci"

- lorsque ta collection deviens hors de portée
- que le destructeur de ta collection est appelé
- ou que tu fermes ton application,
VB va libérer ta collection, et chacun des objets qui sont dedans sont détruits.

De même, en libérant tes objets, ceux-ci libèrent les objets qu'ils contenaient...

Donc aucun souci, les objets sont bien détruits ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
102
Date d'inscription
lundi 29 décembre 2003
Statut
Membre
Dernière intervention
28 juin 2007

salut,

qu'appelles-tu destructeur de ma collection. Est-ce l'affectation set macollec=nothing?

en plaçant une méthode classe_terminate sur les objets de ma colleciton ,je me suis rendu compte des choses suivantes:

set macollec=nothing         'donc si je te suis bien, la collec et ses objets sont détruits
form unload                       'je décharge la feuille 
l'évènement class_terminate est invoqué pour chaque objet de la collection, donc ils n'étaient pas détruits

puisqu'un objet n'est pas détruit tant qu'il est référencé quelque part, pourquoi je ne peut plus accéder aux propriétés de ma collection après un set macollec=nothing alors qu'il y a encore des objets référencés?

je ne suis pas certain de savoir ce qu'est un destructeur (oui, d'acors, c'est une méthode qui détruit, mais comment la mettre en oeuvre)
dans le guide VB en ligne, il est préconisé de bouclé sur tous les objets d'une colelction, et sur les objets des collections des collections (en cascade) pour déférencer correctement (cela s'appelle la TearDown méthode). Cela signifie bien que set macollec=nothing ne suffit pas à détruire la collec ainsi que ses objets.

comprenez-vous mon problème de compréhension?

monsieurlémouche
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
tout dépend au final de la manière dont tu as remplis ta collection, à savoir la chose suivante :
les references contenues dans la collection sont elles les seules references vers tes objets ?
si oui, détruire la collection detruira la seule reference a tes objets => ils seront détruits (Class_Terminate appellé pour chacun d'eux).

si non, il faudra attendre que les autres references soient libérées... soit via un Set ... = Nothing, soit en sortant de la portée des variables (Unload, par exemple).

en clair (quoique)  :

Private moSample as Object
Private moColl As Collection

Sub Test
    Set moColl = New Collection
    Set moSample = New xxxxxx
    moColl.Add moSample
   ...
   ...
   Set moColl = Nothing
End Sub

A la sortie de Test, ici, moSample contient toujours une reference de notre objet, il n'est pas détruit.
la collection a contenu le temps de la procedure une deuxieme reference vers moSample, qui a été libérée lors de l'appel à Set moColl = Nothing...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
102
Date d'inscription
lundi 29 décembre 2003
Statut
Membre
Dernière intervention
28 juin 2007

merci les gars, les filles,

j'aime bien la réponse de casy, l'analogie du livre avec table des matières est très claire.

merci à vous deux

monsieurlémouche