Pregunta

Siempre he leído que se recomienda fijar objetos que nada, una vez que he terminado con ellos. Pero normalmente uso de ellos sólo en funciones dentro de formas.

¿No es la referencia perdida y memoria liberada cuando el ámbito de la función es la izquierda, independientemente de lo programado objetos para nada?

es decir. ¿Es realmente necesario hacer:

Set db = Nothing
Set record_set = Nothing
¿Fue útil?

Solución

VB utiliza un denominado recolector de basura "recuento de referencias".

Básicamente, el momento una variable sale del ámbito, se decrementa el contador de referencia en el objeto de referencia. Cuando se asigna una referencia de objeto a otra variable, el contador de referencia se incrementa.

Cuando el contador llega a cero, el objeto está listo para la recogida de basura. Los recursos objeto se dará a conocer tan pronto como esto sucede. Una variable local función más probable hará referencia a un objeto cuya cuenta de referencia nunca supere el 1, por lo que se dará a conocer los recursos objetar cuando termina la función.

Configuración de una variable a Nothing es la manera de disminuir el contador de la referencia de forma explícita.

Por ejemplo, se lee en un archivo, y establece la variable objeto de archivo de ReadAll() justo después de la llamada <=>. El identificador de archivo se dará a conocer de inmediato, usted puede tomar su tiempo de proceso de su contenido.

Si no se establece a <=>, el identificador de archivo puede ser abierto por más tiempo de lo absolutamente necesario.

Si usted no está en una especie "debe desbloquear recurso valioso" de la situación, simplemente dejando que las variables salir de su ámbito está bien.

Otros consejos

La recolección de basura es raramente perfecta. Incluso en .NET hay veces que se recomienda encarecidamente para solicitar al sistema para hacer la recolección de basura antes de tiempo.

Por esta razón, tanto explícita cerrar y se define en Nada de registros cuando he terminado con ellos.

La última línea del tema de ayuda para " Recordset.Close " en el DAO de ayuda de Microsoft y el acceso desarrollador de referencia es la siguiente:

  

"Una alternativa al método Close es   para establecer el valor de una variable de objeto   a nada (Set dbsTemp = nada) ".

http://msdn.microsoft.com/en-us/library/ bb243098.aspx

Con esto en mente, este artículo de Microsoft Knowledge Base titulada "Cómo prevenir la base de datos hincharse después de utilizar Data Access Objects (DAO)", te dice que debes cierre de forma explícita si no quiere que sus bases de datos a hincharse. Se dará cuenta de que el artículo es un poco vago acerca de los detalles; la sección "Causa" no está clara, casi hasta el punto de ser un galimatías.

http://support.microsoft.com/kb/289562

  

Síntomas: Una base de datos de Microsoft Access   ha comenzado a hincharse (o crecer rápidamente en   tamaño) después de implementar acceso a datos   Objetos (DAO) para abrir un conjunto de registros.

     

Causa: Si no suelta una   la memoria de registros cada vez que se   bucle a través del código de registros, DAO   puede volver a compilar, utilizando más memoria y   aumentar el tamaño de la base de datos.

     

Más información: Cuando se crea una   De registros (o un QueryDef) objeto en   código, cerrar explícitamente el objeto cuando   haya terminado. acceso Microsoft   se cierra automáticamente y de registros   QueryDef objetos más bajo   circunstancias. Sin embargo, si   cerrar explícitamente el objeto en su   código, se puede evitar de vez en cuando   casos en los que el objeto permanece   abierta.

Por último, quisiera añadir que he estado trabajando con bases de datos de acceso durante 15 años, y casi siempre dejo mi variables de registros declarados localmente salir de su ámbito sin utilizar explícitamente el método Close. No he hecho ninguna prueba sobre el mismo, pero eso no parece importar.

Las referencias se supone que deben ser limpiados cuando la variable se sale del ámbito. Es de suponer que esto ha mejorado con versiones posteriores del software, pero fue en un tiempo no confiable. Creo que sigue siendo una buena práctica para establecer explícitamente las variables a "nada".

Cuando se está utilizando ASP clásico (de script del lado del servidor), es de importación para configurar todos los objetos a nada cuando haya terminado con ellos, porque no salir de su ámbito hasta que el servidor [virtual] se apaga.

Por esta razón, todos los ejemplos de secuencias de comandos de MS VB siempre mostraron objetos que se están cerradas y se pusieron a nada. De manera que los fragmentos de secuencia de comandos podría ser utilizado en entornos como ASP clásico en el que los objetos no salir de su ámbito.

Hay, en raras ocasiones, otras situaciones en las que desea codificar procesos de larga duración, donde los objetos no salen fuera del ámbito, y te encuentras el funcionamiento de memoria física si no se libera explícitamente objetos.

Si usted se encuentra de codificación ASP clásico, o ejecutar procesos en el ámbito global por alguna otra razón, entonces sí, usted debe liberar explícitamente los objetos.

Por lo general siempre poner esto al final de mis procedimientos, o llamar a un sub "CloseRecordSet" con ella en si estoy usando los llanos módulo:

Private Sub Rawr()
On Error GoTo ErrorHandler

    'Procedural Code Here.

    ExitPoint:
        'Closes and Destroys RecordSet Objects.
        If Not Recset Is Nothing Then
            If Recset.State = 1 Then
                Recset.Close
                Conn.Close
            End If
            Set Recset = Nothing
            Set Conn = Nothing
        End If
        Exit Sub

    ErrorHandler:
        'Error Handling / Reporting Here.
        Resume ExitPoint
End Sub

De esta manera termina sin embargo el procedimiento, (ya sea normal o debido a un error) los objetos se limpian y los recursos son gratis.

Hacerlo de esa manera es bastante seguro, ya que sólo puede dar una palmada en y sólo se va a hacer lo que es necesario en lo que respecta a cierre o destruir el objeto de registros / conexión, en caso que ya ha sido cerrado (debido a una error de ejecución o simplemente cerrando temprano como ya debería, esto sólo se asegura).

Su realmente no mucha molestia y siempre es la mejor manera de limpiar sus objetos cuando haya terminado con ellos para liberar recursos de inmediato, independientemente de lo que suceda en el programa.

Probar

If Not IsEmpty(vMyVariant) Then
    Erase vMyVariant
    vMyVariant = Empty
End If
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top