2010-03-03 12 views
10

Aprendí mucho sobre weak_ptr trabajando con share_ptr para romper la referencia cíclica. ¿Como funciona? Cómo usar eso? ¿Puede algún cuerpo darme un ejemplo? Estoy totalmente perdido aquí.¿por qué weak_ptr puede romper la referencia cíclica?

Una pregunta más, ¿qué es un puntero fuerte?

+0

"_¿Cómo funciona? _" No, en general. Es una idea estúpida. Tienes que eliminar el ciclo en el nivel de diseño. – curiousguy

+1

@curiousguy Existen algunas escenas en las que su método no funciona, es decir, casos en que las referencias cíclicas se introducen _por diseño_. Por ejemplo, intérprete de un lenguaje dinámico sin GC que soporta la función lambda de primera clase que permite la recursión nativa al capturar su nombre en el entorno circundante (por lo que cuando se crea localmente y luego se devuelve como un valor de primera clase, nada puede poseerlo) y tiene que ser la referencia cíclica, esto se conoce tradicionalmente como el problema del funing downward y la solución clásica es usar un GC). – FrankHB

Respuesta

6

No está incluido en el recuento de referencias, por lo que el recurso se puede liberar incluso cuando existen indicadores débiles. Al usar un weak_ptr, adquiere un shared_ptr de él, aumentando temporalmente el recuento de referencias. Si el recurso ya se ha liberado, la adquisición de shared_ptr fallará.

Q2: shared_ptr es un puntero fuerte. Mientras exista alguno de ellos, el recurso no puede ser liberado.

8

Un puntero fuerte contiene una fuerte referencia al objeto, lo que significa que, mientras exista el puntero, el objeto no se destruirá.

El objeto no "sabe" de cada apuntador individualmente, solo su número: ese es el recuento de referencias fuertes.

Un tipo weak_ptr "recuerda" el objeto, pero no impide que se destruya. No puede acceder al objeto directamente a través de un puntero débil, pero puede intentar crear un puntero fuerte desde el puntero débil. Si el objeto ya no existe, el puntero fuerte resultante es nulo:

shared_ptr<int> sp(new int); 
weak_ptr<int> wp(sp); 

shared_ptr<int> stillThere(wp); 
assert(stillThere); // yes, the original object still exists, we can now use it 
stillThere.reset(); // releasing the strong reference 

sp.reset();   // here, the object gets destroyed, 
        // because there's only one weak_ptr left 

shared_ptr<int> notReally(wp); 
assert(!notReally); // the object is destroyed, 
        // you can't get a strong pointer to it anymore 
+0

La muestra de código complementa su explicación muy bien. –

Cuestiones relacionadas