2010-12-14 8 views

Odpowiedz

23

Prosta odpowiedź nr

Delphi nie jest kompletnym językiem zbieranie śmieci, typy zdefiniowane przez użytkownika powinny być alokowane i zwalniane ręcznie. Zapewnia tylko automatyczne zbieranie, dla kilku wbudowanych typów, takich jak łańcuchy, dynamiczne tablice i interfejsy dla łatwości użycia.

Ale możesz używać interfejsów, które w pewnym stopniu wykorzystują liczenie odwołań do zbierania śmieci.

+6

Warto również wspomnieć o tym, że wszystko, co pochodzi od TComponent pobiera wskaźnik właściciela za pośrednictwem konstruktora, co powoduje zniszczenie obiektu wraz z jego właścicielem. –

+0

delphi garbage zbiera niektóre typy danych, takie jak dynamiczna tablica, string. –

+0

Delphi zna ARC (Automatyczne liczenie odwołań), sposób zarządzania czasem życia interfejsów (wdrażanie RefCount) i innymi typami. W dzisiejszych czasach najnowszy kompilator przenośny Delphi wprowadził ARC do obiektów. Jest kontrolowany przez dyrektywę kompilatora "{$ AUTOREFCOUNT}". patrz link poniżej: http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Automatic_Reference_Counting_in_Delphi_Mobile_Compilers – Lucas

6

W zwykłym znaczeniu zbierania śmieci, gdzie środowisko wykonawcze wykrywa obiekty, do których nie odwołuje się, niszczy je lub w inny sposób odzyskuje niewykorzystane zasoby, nie, Delphi nie zbiera śmieci.

Jeśli używasz natywnego Win32 Delphi, to najbliżej musisz wyrzucać śmieci to różne typy zliczane referencyjnie, w tym ciągi, interfejsy, warianty i dynamiczne tablice. Te typy zostaną automatycznie wyczyszczone, gdy program określi, że nie są już używane, ale robi to poprzez utrzymywanie licznika referencyjnego, gdy te obiekty wchodzą i opuszczają bieżący zakres. Masz również koncepcję własności, która zniszczy posiadane komponenty, gdy właściciel zostanie zniszczony.

Jeśli używasz Delphi dla .Net, oznacza to, że nieumyślnie masz wyrzucone śmieci z podstawowego środowiska wykonawczego.

+2

Delphi.NET jest martwy okres dłuższy niż 2 lata –

+5

Tak, @User, a od Delphi 7 jest dziesięć lat go, też musi być martwy. Poza tym język Delphi jest nadal dostępny dla .Net przez Prism. –

+3

Prism nawet nie próbuje wspólnego źródła, więc nie uważam tego za kontynuację. Z wyjątkiem znaku towarowego. –

17

Tak, robi.

Delphi Win32 nie zawiera śmieciarki po wyjęciu z pudełka, więc inne odpowiedzi na to pytanie są poprawne technicznie. Nie oznacza to jednak, że nie jest to możliwe lub że już nie istnieje. Dzięki wymiennym menedżera pamięci Delphi Barry Kelly wdrożony w pełni funkcjonalny wrapper dla Boehm garbage collector w 2004 roku

Zawiera przykładowy kod potwierdzający jego wykorzystania (w zasadzie tworzenia nieprzypisanych obiektów i oglądając je żuć GC). Są bardziej zaawansowane GC niż Boehm GC, ale to wyraźnie pokazuje, że jest to możliwe i może być używane prawie w sposób przejrzysty. Po prostu dodajesz jednostkę gc na początku klauzuli uses twojego projektu.

I chociaż nie słyszałem o żadnych projektach próbujących go, nic nie stoi na przeszkodzie, by ktoś opakował lub przenosił bardziej zaawansowany gc.

2

Delphi Prism

ma zbieranie śmieci, gdyż opiera się na .NET

Standardowy Delphi (native Win32)

nie ma Garbage Collection

1

Delphi Win32/64 nie ma kosza na śmieci. Możesz jednak skorzystać z mechanizmu liczenia odwołań natywnych Delphi, aby instancje zostały automatycznie zwolnione przy użyciu interfejsów.

Różnice między śmieciarzem a mechanizmem liczenia odnośników polegają na tym, że będziesz musiał zajmować się odwołaniami cyklicznymi, tj. Jeśli odniesienia A i B się nawzajem odwołują, musisz ręcznie przerwać cykl, aby zwolnić A lub B .