c++ boost shared-ptr smart-pointers scoped-ptr

c++ - shared_ptr vs scoped_ptr



boost shared-ptr (5)

scoped_ptr no se puede copiar y se está eliminando del alcance. Por lo tanto, es un tipo de shared_ptr restringido. Así que, además de los casos en los que realmente necesita restringir la operación de copia, es mejor usar shared_ptr . Porque a veces no sabes que necesitas crear una copia de tu objeto o no. Entonces la pregunta es: además de los casos mencionados anteriormente, podríamos considerar que shared_ptr es mejor (o recomendado) para usar en lugar de scoped_ptr . ¿ scoped_ptr funciona mucho más rápido desde shared_ptr , o tiene alguna ventaja?

¡Gracias!


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 que creas en la pila (dentro del alcance local) para que puedas 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.

Suele ver este patrón más con mutexes y otras primativas de sincronización. 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.

También tenga en cuenta que un ''scoped_ptr'' solo tiene sentido cuando no 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 y sus primos.


Su propósito previsto es diferente, por lo que, en muchos casos, "shared_ptr vs scoped_ptr" no es una pregunta en absoluto. Claro, puedes usar un shared_ptr cuando todo lo que necesitas es un scoped_ptr. Pero, ¿cuál es el punto? shared_ptr tiene una sobrecarga ligeramente mayor con todo el recuento de referencias involucrado.


scoped_ptr funciona mucho más rápido desde shared_ptr . Es lo correcto. shared_ptr siempre asigna memoria usando su asignador o asignador predeterminado.


shared_ptr es más pesado que scoped_ptr . Necesita asignar y liberar un objeto de recuento de referencia, así como el objeto gestionado, y gestionar el recuento de referencias seguras para subprocesos. En una plataforma en la que trabajé, esta fue una sobrecarga significativa.

Mi consejo (en general) es usar el objeto más simple que satisfaga tus necesidades. Si necesita compartir el recuento de referencias, use shared_ptr ; si solo necesita eliminación automática una vez que haya terminado con una sola referencia, use scoped_ptr .


Rendimiento : shared_ptr tiene más funcionalidad, pero también requiere una asignación adicional (también es más grande, pero eso rara vez importa).

[edit] La segunda asignación se puede evitar usando make_shared , pero luego weak_ptr retendrá toda la asignación incluso después de que se destruya el objeto, lo que puede ser un problema para objetos grandes.

Expresion de intencion usando scoped_ptr usted scoped_ptr mas explícitamente lo que quiere hacer. (En caso de que te lo preguntes, eso es algo bueno :)). Si haces esto correctamente, shared_ptr también indicará que "este objeto está destinado a vivir más allá de este alcance"