Es objeto de compensación/matriz de desasignación realmente necesario en VB6/VBA (Pros/Contras?)

StackOverflow https://stackoverflow.com/questions/1525772

  •  20-09-2019
  •  | 
  •  

Pregunta

Mucho de lo que he aprendido acerca de VB que he aprendido de el uso de Análisis de Código Estático (Particularmente Aivosto Proyecto del Analizador).Y una de las cosas que comprueba es si o no usted borra todos los objetos y matrices.Yo solía hacerlo a ciegas, porque PA lo dijo.Pero ahora que sé un poco más sobre la forma en VB libera recursos, me parece que estas cosas deberían estar sucediendo de forma automática.Es este un legado función de pre VB6, o hay una razón por qué usted debe establecer explícitamente los objetos de regreso a la nada y el uso de Borrar en las matrices?

¿Fue útil?

Solución

El problema, como yo lo entiendo, tiene que ver con el hecho de que en VB6 (y sus predecesores) tiene sus raíces en COM, y su referencia de conteo de sistema de recolección de basura.

Imaginemos, por ejemplo, que se declara un refernece a un objeto de una 3ra parte de la biblioteca.Que objeto tiene un COM recuento de referencia que se utiliza tanto para mantenerlo vivo, y para determinar cuando debe ser destruido.No es destruido cuando se pasa Nada, pero cuando el objeto de referencia de la cuenta llegue a cero.

Ahora, no todos los componentes COM fueron escritos en Visual Basic.Algunos fueron escritos en C o C++.El control estructurado de excepciones no existen en todos los idiomas.Así que si se ha producido un error, el recuento de referencia en el objeto no estaba garantizado para ser debidamente reducida, y los objetos COM conocido para colgar alrededor más de lo que se pretende.Esto no era un problema con Visual Basic, per se.Se trataba de un problema COM.(Y que, usted puede observar, es el por qué .NET no utilizar el conteo de referencias.)

Es por eso que los desarrolladores de Visual Basic se convirtió en el trastorno obsesivo acerca de la liberación de las referencias a objetos antes de salir de la rutina.Usted simplemente no sabe lo que es un componente que vaya a asignar es la creación de debajo del capó.Pero cuando usted suelta su referencia, tienes al menos la liberación de su recuento de referencia para.Se convirtió casi en un mantra religioso.Declarar, el uso, la liberación.Fue el COM forma de hacer las cosas.

Seguro, Visual Basic que podría ser mejor o más rápido al eliminar las variables declaré en la pila.Pero maldita sea, yo quiero que sea OBVIO que esos objetos fueron puestos en libertad.Seguridad un poco va un largo camino cuando usted está tratando de rastrear a una pérdida de memoria.

Otros consejos

Matt Curland, autor de Avanzado De Visual Basic 6, quién sabe más acerca de Visual Basic que la mayoría de nosotros alguna vez, piensa que es un esfuerzo inútil.Considere esta cita (p110) acerca de DAO, la COM biblioteca de acceso a datos que se centra principalmente en el Acceso de Motor de Base de datos:

otro ejemplo de mala desmontaje de código.DAO cuenta con Cerca de los métodos que deben ser llamados en el orden correcto, y el los objetos deben ser liberados en el orden correcto así (conjunto de registros antes de la Base de datos, por ejemplo).Este solo buenos objeto de modelo de comportamiento ha condujo a la idea de que la VB fugas la memoria a menos que se establezca explícitamente todos las variables locales a nada en el final de una función.Este es un idea completamente falsa en un bien diseñados modelo de objetos.VB claro que las variables más rápido al Final Sub línea que usted puede desde el código, y comprueba las variables, incluso si usted liberar explícitamente sus referencias.Cualquier esfuerzo que ustedes hacen es duplicar.

Tienen que leer esto Aivosto página web (de los creadores de Project Analyzer)?

Si usted está utilizando las variables estáticas, es importante recuperar la memoria ellos ocupado cuando usted no necesita el las variables más.Con la dinámica de las variables de la memoria no es tanto de un problema, porque son destruidos cuando finaliza el procedimiento.

En otras palabras, usted no necesita preocuparse por la limpieza de ordinario, no estático, las variables locales.

Siempre lo hago de buena práctica, nunca se sabe lo que es una excepción podría hacer si usted se cae en uno y sus objetos no son removidos.Usted debe relase ellos finalmente declaraciones y asegurarse de que no están de utilizar cualquier memoria de lo contrario se puede ejecutar en una pérdida de memoria.

Tuve un problema en el interior de un simple tiempo de apagado del sistema de seguimiento donde el servidor se mantiene en estrellarse al azar, tomó semanas para determinar que era una pérdida de memoria de un objeto que se supone que iba a autodestruirse por su propia cuenta.Mi código era ser arrojado a una excepción y nunca limpiar después de sí mismo causando el servidor (el sitio web real no todo el servidor) para ir hacia abajo.

Sí, el conjunto de todos los objetos a la Nada y limpiar tanto como usted puede.VB6 es conocido por tener pérdidas de memoria cuando no la limpieza de sus cosas.La recolección de basura fue sub-par en VB6/VBA.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top