Der einfachste Weg, ein Speicherleck zu erzeugen, ist die missbräuchliche Verwendung von Einrichtungen, die für Interop entwickelt wurden, da sie mit nicht verwaltetem Speicher arbeiten.
Weisen Sie zum Beispiel eine GCHandle
auf ein Objekt zeigen und es niemals freigeben.
Bearbeiten: Gibt es irgendwelche scheinbar normalen, harmlosen Anwendungen, die Speicherlecks verursachen können?
Soweit ich weiß, gibt es nur eine, insbesondere in einigen UI-Programmen. Es war möglich, in WinForms, aber erst vor kurzem wurde durch WPF mit MVVM üblich:
Der entscheidende Punkt, den viele Leute übersehen, ist, dass ein Delegat einen Verweis auf das Objekt enthält, auf dem er ausgeführt wird.
Wenn man also ein Muster wie MVVM mit bidirektionalen Bindungen (implementiert mit Ereignissen, bestehend aus Delegaten) verwendet und die Ansicht in eine andere Ansicht mit demselben ViewModel geändert wird, bleiben die Aktualisierungen des ViewModels standardmäßig an beide Ansichten gebunden, was zu einem Leck in der alten Ansicht führt.
Theoretisch kann dies mit jedem Delegierten geschehen, aber in der Praxis ist es nicht üblich, da der Abonnent normalerweise den Herausgeber überlebt oder sich abmeldet.
Eine ähnliche Situation besteht, wenn Lambda-Ereignishandler abgemeldet werden:
timer.Elapsed += (_, __) => myObj.Notify();
timer.Elapsed -= (_, __) => myObj.Notify();
Obwohl die Lambda-Ausdrücke in diesem Fall identisch sind, stellen sie unterschiedliche Handler dar, so dass die Elapsed
Ereignis wird weiterhin aufgerufen Notify
. Die zweite Zeile oben hat keine Auswirkung; weder wird das Abonnement abbestellt, noch wird ein Fehler ausgelöst.
Beachten Sie, dass unsachgemäße Abmeldungen in der Regel beim Testen erkannt werden, so dass sie nur selten zu "Lecks" im veröffentlichten Code führen. Im Gegensatz dazu verursacht die obige MVVM-Situation keine beobachtbaren Nebeneffekte (außer einem Speicher- und Ressourcenleck).