delete
wywołane na uchwycie zarządzanym (stworzonym przez gcnew
) spowoduje wywołanie destruktora, co daje możliwość deterministycznego zwolnienia innych obiektów zarządzanych. Destruktor (~Klasa) powinien także wywołać finalizera (!Klasa), który zwolni pamięć niezarządzaną. Gdy użyjemy delete
, GC nie wywoła już go później sam.
Co warte podkreślenia - używanie delete
nie jest konieczne. Jeżeli pasuje nam niedeterministyczne zwolnienie to możemy oddać się w łaskę GC, który sam zwolni wszystkie zarządzane obiekty (co oznacza, że nasz destruktor NIE zostanie wywołany) oraz wywoła nasz Finalizer.
W przypadku obiektu, który w C# implementuje IDisposable
, to metoda Dispose pełni rolę destruktora, a destruktor z C# rolę Finalizera.
Można również zaznaczyć, że w C++/CLI istnieje scope semantics dla obiektów zarządzanych. Po wyjściu ze scope zostanie wywołany destruktor (który, powtarzam, powinien wywołać finalizer).
http://msdn.microsoft.com/en-us/library/ms177197%28v=vs.110%29.aspx