.net c++-cli

.net - Entendiendo gcroot



c++-cli (1)

La recolección de basura no solo elimina los objetos sin referencia, sino que también se mueve alrededor de los objetos a los que todavía se hace referencia, por ejemplo, para desfragmentar el conjunto de memoria libre. Cuando el artículo habla sobre los objetos que se mueven en el montón de CLR, es probable que diga que "cuando la recolección de basura mueve un objeto al que todavía se hace referencia, el controlador gcroot se actualizará automáticamente para que apunte al objeto CLR".

Puede evitar que GC mueva objetos usando la palabra clave pin_ptr , así:

Object ^obj = gcnew <something>; pin_ptr pinned = obj; /* obj won''t move due to GC as long as pinned is in scope. */ /* do something interop-y here, pass to native code in a DLL, etc. */

Consulte este artículo para obtener más información acerca de la fijación.

Observación: El artículo puede tener un error tipográfico. Si hubiera dicho "dentro del montón de recolección de basura" en lugar de "con el montón de recolección de basura", ¿eso habría mejorado su comprensión? La forma en que está redactado en el artículo hace que parezca que la misma tierra se movería bajo tus pies cada vez que GC limpiara la casa.

He estado leyendo este article para entender la plantilla gcroot. Yo entiendo el

gcroot proporciona identificadores en el montón de basura recolectada

y eso

Las asas en sí no son recogidas de basura.

Lo que no entiendo es lo siguiente:

Cuando el objeto CLR se mueve con el montón recogido de basura, el identificador devolverá la nueva dirección del objeto. Una variable no tiene que estar anclada antes de asignarla a una plantilla gcroot.

¿Eso significa que el objeto CLR será eliminado por el recolector de basura incluso si hay un controlador gcroot que hace referencia a ese objeto?

¿A qué se refiere la "nueva dirección"? ¿Y qué significa que la "variable no tiene que estar anclada antes de asignarse a una plantilla gcroot"?