Est-il possible par exemple de détruire/supprimer soi-même?
NOTE: je suis intéressé par C#,Java et C++ en plus, mais comme c'est la plus académique question n'importe quelle langue va faire.
Je sais que ce problème est résoluble de l'extérieur, par l'utilisation appropriée des méthodes de langues (l'appel de free
, Dispose
, ou en supprimant toutes les références à l'instance).
Mon idée est que je crée une instance, et dans le constructeur , je commence le privé de la minuterie. Lorsque le compte à rebours se termine, il va appeler certains de la méthode d'instance et de détruire la variable.
Je pense qu'en C#, il devrait être possible d'appeler Dispose
sur soi, lorsque l' IDisposable
est mis en œuvre, mais ce ne serait pas détruire la instace.
En C++ que je pourrais appeler la destructor
, mais qui aurait conduit à la fuite de mémoire, plus il est vraiment une mauvaise pratique.
En Java je n'ai aucune idée, en assignant à la this
il n'est pas possible car il est final
champ.
Donc est-il possible par exemple, de détruire soi-même?
Normalement, le GC .NET fait un assez bon travail sur son propre. À moins de créer votre fuite de mémoire en gardant un objet statique (ou autre) alors qu'il devrait être retiré par la suite. Il est plausible que vous pourriez utiliser une méthode de fabrique, ce qui ne serait pas de retour d'une référence directe à l'objet, mais d'une référence faible à la place. Il a probablement n'aide pas beaucoup; vous pouvez toujours récupérer une référence forte via la référence faible. Peut-être que la meilleure question est: quel problème est-ce que vous essayez de résoudre?
Cela dépend de ce que tu veux dire par "détruire/supprimer" en Java. Vous pouvez appeler n'importe quelle méthode sur
this
- qui est équivalent, par exemple en appelant dispose() sur un objet en C#. Si vous voulez dire que vous souhaitez que l'objet soit ordures collectées vous avez juste à effacer toutes les références à celui-ci et d'attendre que le garbage collector pour libre.Dans votre scénario, ce qui devrait se produire à n'importe quel thread qui exécute actuellement une méthode d'instance de la mort de l'instance?
OriginalL'auteur jnovacho | 2013-07-05
Vous devez vous connecter pour publier un commentaire.
Votre question est très intéressante, et je ne connais pas d'autre façon de le faire en C#, mais à force de l'intérieur de l'instance de sa destruction de l'extérieur. C'est donc ce que j'ai trouvé pour vérifier s'il est possible.
Vous pouvez créer la classe
Foo
, qui a de l'événement est déclenché lorsque l'intervalle du timer est écoulé. La classe qui est inscrit à cet événement (Bar
) dans les cas de registres de l'événement et définit la référence de l'instance denull
. C'est comment j'allais le faire, testé et il fonctionne.Et pour tester cela, vous pouvez configurer un clic sur un bouton dans un Formulaire, quelque chose comme cela, et de le vérifier dans le débogueur:
Alors la prochaine fois quand vous cliquez sur le bouton, vous serez en mesure de voir que
Bar
instance existe toujours mais laFoo
instance dans un délai de elle est nulle même si elle a été créée au sein de laBar
'constructeur.OriginalL'auteur Nikola Davidovic
C++: Si un objet a été alloué dynamiquement, il peut supprimer son ce pointeur dans sa propre fonction, à condition que le pointeur this est jamais utilisé à partir de ce point.
OriginalL'auteur Neil Kirk
Non, il n'y a aucun moyen d'obtenir ce que vous essayez de faire en
C#
.Si vous considérez un exemple :
après un certain temps
DestroyMe()
sera appelé que nettoie interne de données.Mais la référence
kamikadze
(pointeur si vous le souhaitez) est toujours valide et points à cet emplacement de la mémoire, de sorteGC
ne rien faire, à ne pas recueillir, et de l'instance deKamikadze
restera en mémoire.OriginalL'auteur Tigran
Pour C++ de prendre un coup d'oeil à ceci:
http://www.parashift.com/c++-faq/delete-this.html
.
OriginalL'auteur Slava
La chose la plus proche en C# que je peux penser:
Sur la création, chaque objet stocke une référence à lui-même à la racine de la rp, par exemple en mettant la référence dans une classe statique de la liste. En dehors de la classe, personne n'est autorisé à stocker (fort) les références à l'objet. Tout le monde utilise un
WeakReference
et vérifie si leTarget
est encoreIsAlive
avant de toucher l'objet. De cette façon, la seule chose qui est de garder l'objet vivant, c'est la référence statique.Lorsque l'objet décide de tuer lui-même, il supprime simplement la référence de la liste. Tôt ou tard, le GC recueille l'objet. Ou, si vous êtes vraiment impatient, appel
GC.Collect()
(ouch!).Mais j'ai vraiment vraiment recommande pas cette solution!
C'est beaucoup mieux de mettre quelques-drapeau dans la classe/objet de signal s'il est encore en vie et de faire tout le monde de vérifier ce drapeau avant d'utiliser l'objet. Ceci peut être combiné avec le
IDisposable
solution.OriginalL'auteur Sebastian Negraszus
En C++, les instances de suicide font partie intégrante de la Machine à états Finis Motif:
OriginalL'auteur Casey