2011-01-03 11 views
11

Estoy aprendiendo D desde 8 años en C++. Mi pregunta es respecto a la recolección de basura D, ¿cuándo uso eliminar y cuándo no?Cuándo eliminar en D?

+2

¿La recolección de basura no significa que no es necesario 'borrar' en absoluto? – delnan

Respuesta

14

No es así. Eliminar no se debe usar con la versión D 2 y se debe eliminar del idioma. Lo que es la espera, no estoy seguro. En su lugar, utiliza una función, destroy (objeto), que llama al destructor donde puede liberar recursos que no son memoria del GC. El destructor se causará nuevamente durante la recolección GC de la memoria propia del objeto. Esto se explica en "The D Programming Language".

La idea es recuperar los recursos antes de lo que el GC proporcionaría y evita que la corrupción de memoria cuelgue los punteros. Para ser menos seguro, el módulo core.memory proporciona GC.free (object) que se puede usar para liberar la memoria, después de llamar a destroy (object).

Como no soy un programador de C++, realmente no conozco el patrón RAII, pero este y el recuento de referencias es la estrategia esperada si desea evitar el GC.

+3

Sí. 'clear()' se usa para llamar al destructor de un objeto y ponerlo en un estado no válido, pero sigue siendo tarea del GC reclamar la memoria. 'delete' se va completamente. Si quiere administrar la memoria por completo, usa 'malloc' y' free'. Sin embargo, usar 'clear()', 'malloc' y' free' en el código D realmente no debería ser la norma. Están ahí para esos casos especiales donde los necesita. –

+2

Gracias Jonathan, no quise dar a entender que sería común usar dicho patrón. Solo que esta es la facilidad para hacerlo. Lo que hace que Corbin March sea una mejor respuesta ya que la pregunta realmente no era sobre la eliminación en sí misma. –

10

Eche un vistazo a Garbage Collection en la documentación D. Como se señaló, es (casi) innecesario administrar explícitamente la memoria. Por supuesto, después de pasar un puñado de puntos tratando de convencerlo del poder del GC, estos incluyen algunos escenarios en los que la recolección de basura se queda corta. Para abordar estas caídas cortas (las llaman restricciones), Digital Mars ofrece consejos para Memory Management.

Si es posible, deje que el recolector de basura D haga su trabajo. Ignorar la administración de memoria explícita. En algunos escenarios muy específicos, existe la posibilidad de una inaceptable pausa o memoria inactiva del GC que no se puede reclamar. Si su aplicación incluye uno de estos escenarios (prueba y perfil para probarlo), aísle la causa del problema y administre explícitamente la memoria cuando sea necesario. D te permite comenzar como un optimista. Si las cosas no funcionan a la perfección, es reconfortante que pueda recurrir a la administración de memoria explícita.

+0

Gracias - He revisado la documentación de la recolección de basura, pero no me pareció lo suficientemente claro como para hacer una suposición. – bfops