Los objetos viven desde que se crean hasta que se establecen a Nothing, o hasta que el programa finalice normalmente. En el caso de referencias circulares, teóricamente nunca se destruyen (a menos que el programa finalice).
Vamos a suponer que tenemos dos módulos de clase:
Ahora, vamos a hacer algunas pruebas:
Como verás, este es un claro ejemplo de referencias circulares. Lo que sucede cuando eliminamos TODAS nuestras instancias conocidas como hicimos con la variable Padre e Hijo, en memoria sigue existiendo al menos una instancia de cada una, e indestructibles porque cada una hace referencia a la otra.
Hay que tener mucho cuidado con esto a la hora de usar referencias circulares, y en todo caso si una clase se va a crear recursivamente evitar este tipo de prácticas porque podríamos ocupar grandes cantidades de memoria.
De todas formas, TODOS los objetos se destruyen -sí o sí- cuando el proceso se cierra, porque están guardados siempre en el espacio de direcciones de memoria de este proceso.
Saludos.
Vamos a suponer que tenemos dos módulos de clase:
Código [Seleccionar]
'
' CClasePadre
'
Private oChild As CClaseHijo
Function foo(sArg As String) As Boolean
Debug.Print sArg
foo = True
End Function
Property Get Child() As CClaseHijo
Set Child = oChild
End Property
Private Sub Class_Initialize()
'
' Constructor de la clase.
' Crea una instancia de la clase Hijo y
' se asigna a sí misma como Padre.
'
Set oChild = new CClaseHijo
oChild.setParent(Me)
End Sub
Código [Seleccionar]
'
' CClaseHijo
'
Private oParent As CClasePadre
Friend Sub setParent(oArg As Object) As Boolean
Set oParent = oArg
End Function
Property Get Parent() As CClasePadre
Set Parent = oParent
End Property
Ahora, vamos a hacer algunas pruebas:
Código [Seleccionar]
Sub TestClass()
Dim Padre As CClasePadre
Dim Hijo As CClaseHijo
' Crea el objeto Padre y la función constructora del
' mismo crea una instancia de Hijo (Class_Initialize)
'
Set Padre = New CClasePadre
'
' Obtiene una referencia del hijo del objeto
' padre y la guarda en la variable local Hijo
'
Set Hijo = Padre.Child
'
' En teoría debería destruir al objeto Padre, pero
' como Hijo tiene la propiedad Parent que hace referencia
' a nuestro objeto Padre, el objeto no se destruye, sólo
' esta instancia.
'
Set Padre = Nothing
'
' Ahora en teoría, debería destruirse el objeto Hijo, pero como
' este tiene la propiedad Parent con el objeto Padre (que en teoría ya
' destruímos si no supiéramos que sigue activo en este lugar), y
' Parent (Padre) tiene la propiedad que hace referencia a Hijo,
' el objeto no se destruye, SÓLO la instancia guardada en Hijo
'
Set Hijo = Nothing
End Sub
Como verás, este es un claro ejemplo de referencias circulares. Lo que sucede cuando eliminamos TODAS nuestras instancias conocidas como hicimos con la variable Padre e Hijo, en memoria sigue existiendo al menos una instancia de cada una, e indestructibles porque cada una hace referencia a la otra.
Hay que tener mucho cuidado con esto a la hora de usar referencias circulares, y en todo caso si una clase se va a crear recursivamente evitar este tipo de prácticas porque podríamos ocupar grandes cantidades de memoria.
De todas formas, TODOS los objetos se destruyen -sí o sí- cuando el proceso se cierra, porque están guardados siempre en el espacio de direcciones de memoria de este proceso.
Saludos.