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
"_¿Cómo funciona? _" No, en general. Es una idea estúpida. Tienes que eliminar el ciclo en el nivel de diseño. – curiousguy
@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