2011-01-03 12 views
11

Uczę się D od 8 lat w C++. Moje pytanie dotyczy zbierania śmieci D - kiedy używam usuwania i kiedy nie muszę tego robić?Kiedy usunąć w D?

+2

Czy usuwanie śmieci nie oznacza, że ​​wcale nie trzeba "usuwać"? – delnan

Odpowiedz

14

Nie. Usunięcia nie można używać z wersją D 2 i ma zostać usunięte z języka. Co to za wstrzymanie, nie jestem pewien. Zamiast tego należy użyć funkcji, destroy (obiekt), która wywołuje destruktor, gdzie można zwolnić zasoby, które nie są pamięcią GC. Destruktor zostanie wywołany ponownie podczas gromadzenia GC pamięci obiektów. Zostało to wyjaśnione w "The D Programming Language".

Chodzi o to, aby odzyskać zasoby wcześniej niż to, co zapewnia GC, i zapobiegać uszkodzeniu pamięci przez zwisające wskaźniki. Aby być mniej bezpiecznym, moduł core.memory dostarcza GC.free (object), który może być użyty do zwolnienia pamięci, po wywołaniu destroy (object).

Ponieważ nie jestem programistą C++, tak naprawdę nie znam wzorca RAII, ale to i liczenie odwołań jest oczekiwaną strategią, jeśli chcesz uniknąć GC.

+3

Tak. 'clear()' używane jest do wywoływania destruktora obiektu i umieszczania go w niepoprawnym stanie, ale nadal zadaniem GC jest odzyskiwanie pamięci. "delete" znika całkowicie. Jeśli chcesz całkowicie zarządzać pamięcią, użyj 'malloc' i' free'. Jednak używanie 'clear()', 'malloc' i' free' w kodzie D naprawdę nie powinno być normą. Są tam dla specjalnych przypadków, kiedy ich potrzebujesz. –

+2

Dziękuję Jonathan, nie chciałem sugerować, że powszechne byłoby stosowanie takiego wzoru. Tyle tylko, że jest to możliwe. Co sprawia, że ​​Corbin March jest lepszą odpowiedzią, ponieważ pytanie nie dotyczyło samego usunięcia. –

10

Proszę spojrzeć na Garbage Collection w dokumentacji D. Jak już wspomniano, (prawie) nigdy nie jest konieczne jawne zarządzanie pamięcią. Oczywiście po wydaniu kilku punktów, próbujących przekonać cię o mocy GC, zawierają one kilka scenariuszy, w których zbieranie śmieci nie jest łatwe. Aby rozwiązać te niedociągnięcia (nazywają je ograniczeniami), Digital Mars oferuje wskazówki dotyczące Memory Management.

Jeśli to możliwe, niech D garbage collector zrobi swoje. Ignoruj ​​jawne zarządzanie pamięcią. W kilku bardzo konkretnych scenariuszach istnieje potencjalna niedopuszczalna przerwa GC lub pamięć, której nie można odzyskać. Jeśli aplikacja zawiera jeden z tych scenariuszy (test i profil, aby to udowodnić), odizoluj przyczynę problemu i, w razie potrzeby, jawnie zarządzaj pamięcią. D pozwala zacząć jako optymista. Jeśli coś nie działa idealnie, to zapewnia, że ​​możesz odwołać się do zarządzania pamięcią jawną.

+0

Dzięki - przejrzałem dokumentację dotyczącą zbierania śmieci, ale nie było to dla mnie wystarczająco jasne, aby poczynić jakiekolwiek przypuszczenia. – bfops