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?
Odpowiedz
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.
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. –
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. –
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ą.
Dzięki - przejrzałem dokumentację dotyczącą zbierania śmieci, ale nie było to dla mnie wystarczająco jasne, aby poczynić jakiekolwiek przypuszczenia. – bfops
- 1. usunąć zerowe linie 2-D numpy tablicy
- 2. Porównanie czasu w D
- 3. Pobierz plik w D
- 4. QueryPerformanceCounter w D?
- 5. odpowiednik remove_if w D
- 6. Uwolnienie zasobów w języku D
- 7. W języku java -D co oznacza skrót D?
- 8. Dodawanie macierzy 1-D do macierzy 3-D w Numpy
- 9. Różnica między "\\ d +" i "\\ d ++" w java regex
- 10. Co to jest (\ d +)/(\ d +) w wyrażeniu regularnym?
- 11. Jak połączyć z bibliotekami D w programie D
- 12. Kiedy mogę usunąć plik po użyciu go w pliku Response.WriteFile()?
- 13. pisanie w kaczce w D
- 14. Implementacja C API w D
- 15. Rozproszona wiadomość przechodzi w D?
- 16. Włókna nad wątkami w D
- 17. Wykrywanie nazw funkcji w D
- 18. Jak wdrożyć zakresy w D
- 19. Czyste funkcjonalne programowanie w D
- 20. Co to są instrukcje "jest" w D?
- 21. Dlaczego warto korzystać z @property w D?
- 22. Dlaczego warto używać statycznego w D?
- 23. „wspólna” i „__gshared” Keywords D
- 24. Kiedy dokument HTML ma manifest (cache.manifest), jak możesz go usunąć?
- 25. jak i kiedy usunąć stare pliki dziennika transakcji neo4j
- 26. różnica między funkcją (d) i funkcją (d, i)?
- 27. Czy trzeba czyścić związany obiekt kiedy usunąć element
- 28. Kiedy należy utworzyć i usunąć obiekt PayPal WebProfile (PHP)
- 29. D Proces kompilacji
- 30. D runtime jako DLL
Czy usuwanie śmieci nie oznacza, że wcale nie trzeba "usuwać"? – delnan