Forum: PC-Programmierung [C#] Verwaiste Events und Garbage Collector


von Dieter L. (Gast)


Lesenswert?

Hallo zusammen,

kurze Theroriefrage zu C#, Events und dem GarbageCollector:
Angenommen ein ObjektA registriert sich auf ein Event des ObjektsB. 
ObjektA wird anschliessend nicht mehr verwendet. Eigentlich sollte der 
Garbage Collector dann doch den Konstruktor für ObjektA aufrufen und 
dieses dann entsorgen. Wird dabei dann auch gleich die Liste der 
registrierten Events in ObjektB zurechtgestutzt?

Konkret/Nochmal anders: Ich habe eine grafische Ausgabe (ObjektA), das 
den Inhalt einer Variablen (ObjektB) ausgeben kann. Um immer aktuell zu 
sein, registriert sich die grafische Ausgabe bei der anzuzeigenden 
Variablen in deren ValueChanged-Event. Jetzt wird das Control (hier: 
MDI-Fenster) mit der grafischen Ausgabe geschlossen. (Dabei wird doch 
auch ObjektA zerstört?!). Was passiert mit dem Verweis in der Eventliste 
von der Variablen? Wenn ich jetzt das Fenster 1000mal öffne (-> 
registriere) und wieder schliesse, ist danach dann noch 1000x das Event 
eingehängt?

Ist dies der typische Anwendungsfall für die Verwendung eines expliziten 
Destruktors? Oder erledigt das auch der GarbageCollector automatisch?

Danke.

von Arc N. (arc)


Lesenswert?

Dieter L. schrieb:
> Hallo zusammen,
>
> kurze Theroriefrage zu C#, Events und dem GarbageCollector:
> Angenommen ein ObjektA registriert sich auf ein Event des ObjektsB.
> ObjektA wird anschliessend nicht mehr verwendet. Eigentlich sollte der
> Garbage Collector dann doch den Konstruktor für ObjektA aufrufen und
> dieses dann entsorgen. Wird dabei dann auch gleich die Liste der
> registrierten Events in ObjektB zurechtgestutzt?

Nein, ObjectA wird in dem Fall auch nicht entsorgt, da ObjectB einen 
Verweis (über den Event) auf ObjectA hält, es sei denn man löscht die 
Event-Registrierung.

Letztlich ist das ein grundsätzliches Problem bei GCs, da nur
nicht mehr referenzierte Speicherbereiche freigeben werden (können), 
nicht aber nicht verwendete Speicherbereiche erkannt werden können 
(schlich und ergreifend, da es nicht beweisbar ist, ob ein 
Speicherbereich nie mehr benutzt werden wird).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.