vb6 memory-management dictionary

vb6 - ¿El método RemoveAll() de Scripting.Dictionary libera todos sus elementos primero?



dictionary vb6 (3)

En una aplicación VB6, tengo un Dictionary cuyas claves son String y los valores son instancias de una clase personalizada. Si llamo RemoveAll() en el Dictionary , ¿primero liberará los objetos personalizados? ¿O debo hacerlo explícitamente yo mismo?

Dim d as Scripting.Dictionary d("a") = New clsCustom d("b") = New clsCustom '' Are these two lines necessary? Set d("a") = Nothing Set d("b") = Nothing d.RemoveAll


Sí, todos los objetos del Dictionary lanzarán después de una llamada a RemoveAll() . Desde un punto de vista de rendimiento (como en velocidad), diría que esas líneas que establecen las variables a Nothing son innecesarias, porque el código primero debe buscarlas basándose en los nombres de las teclas, mientras que RemoveAll() enumerará y liberará todo en un ciclo.


Si no hay otras variables que hagan referencia a los elementos en la colección, entonces esos objetos se deben entregar al colector de basura para que se limpien la próxima vez que se ejecute el GC.

Si usted, por ejemplo, hace esto donde sObj es una variable estática en alguna parte, entonces cuando el sistema invoque el GC, el primer objeto se limpiará, pero el segundo que aún se referencia con sObj no lo hará.

d("a") = New clsCustom d("b") = New clsCustom code. sObj = d("b") d.RemoveAll()


RemoveAll eliminará todas las asociaciones del Dictionary : tanto las claves como los valores. Sería una fuga de referencia para el Dictionary mantener una referencia a los valores en el Dictionary .