Scoped_ptr tiene poco en común con shared_ptr, weak_ptr, o unique_ptr porque solo está haciendo un caso muy especial de "recuento de referencias" . No es algo que necesitarás muy a menudo en un código bien diseñado, pero es una buena herramienta para tener disponible.
Básicamente, un scoped_ptr no es una cosa contada en absoluto. Más bien, es un objeto se crea en la pila (en el ámbito local) para que pueda hacer algo como esto:
//Some enclosing scope- anything set off by "{}" or even a function:
{
scoped_ptr<MyObject> ptr = new MyObject(parameters...);
} // When we hit this closing brace, "ptr" will delete the "MyObject" inside.
Se tiende a ver este patrón más con mutex y otro de sincronización primatives- puedo declarar un "AutoLock" que bloqueará el mutex pasado en él, y luego lo desbloqueará cuando lo elimine para convertir todo el alcance "{}" en una sección crítica.
Observe también que un 'scoped_ptr' solo tiene sentido cuando no se puede simplemente hacer una asignación de stack simple como "MyObject obj (params ..)" por alguna razón. Después de todo, lo que hace es permitirte usar un objeto alojado en el montón como si fuera uno en la pila.Eso tiende a ser un caso de uso mucho más raro que el recuento de referencias de shared_ptr & sus primos.
Mike, no podría estar más de acuerdo. Siempre recomiendo a las personas que comiencen con 'boost :: scoped_ptr'. Si necesita una semántica de transferencia de propiedad (manteniendo la propiedad única), entonces "actualice" a 'std :: auto_ptr'. Si solo necesita propiedad compartida, entonces usa 'boost :: shared_ptr'. Además, la biblioteca 'Boost.ptr_container' es una buena alternativa a los contenedores de boost :: shared_ptr cuando los elementos realmente no necesitan ser compartidos. –
Como comentario: si necesita punteros compartidos, puede deshacerse de las asignaciones adicionales asignando objetos usando 'make_shared' o' allocate_shared' en lugar de 'new'. –
@David: en general estoy de acuerdo, pero omito 'auto_ptr' por completo. No se puede usar de forma segura en contenedores estándar, por lo que es probable que brinde algunas sorpresas desagradables si no es * realmente * cuidadoso. – jalf