zwalnianie pamięci

0

1: Jeżeli utworzę stringa:

String^ s=gcnew String("cos");

Tu muszę go zwalniać funkcją delete czy jest on już automatycznie zarządzany przez GC?

2:
A jeżeli mam:

const char *cstr = "halo";
char *c = cstr;
delete c;

to muszę też zwalniać cstr?

1

Jak robisz gcnew, to tym obiektem zajmuje się już Garbage Collector (GC), jak nazwa wskazuje. ^ to wskaźnik zarządzany, m.in. współdziałający z GC. * nie współpracuje z GC (ogólnie rzecz mówiąc).

1

Tu muszę go zwalniać funkcją delete czy jest on już automatycznie zarządzany przez GC?
Powinno się zwalniać deletem obiekty, które implementują interfejs IDisposable.
String do nich nie należy, więc delete nie używasz.

A jeżeli mam:

const char *cstr = "halo";
char *c = cstr;
delete c;

to muszę też zwalniać cstr?
To już jest tak samo jak w natywnym C i C++. W tym przypadku nie wolno użyć delete, bo wskaźniki c i cstr wskazują na literał stały, którego nie da się zwolnić.

0

A takie coś:

char *cstr = "halo";
char *c = cstr;
delete c;

Czy tu też nie trzeba zwalniać?

1

tu nie trzeba powinno się bo "halo" nie jest tworzone dynamicznie

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1