smart shared_ptr example c++ shared-ptr unique-ptr auto-ptr weak-ptr

c++ - example - std:: unique_ptr vs std:: shared_ptr vs std:: weak_ptr vs std:: auto_ptr vs punteros en bruto



shared_ptr example (1)

¿Cuáles son los usos equivalentes de cada puntero inteligente en comparación con algunas técnicas avanzadas similares (pero no limitadas a) que utilizan punteros sin procesar?

Mi comprensión es mínima, pero de lo que puedo reunir:

  • Punteros sin procesar: utilice solo si realmente, realmente, realmente, realmente, sabe lo que está haciendo y tiene un uso cuidadosamente oculto detrás de una interfaz.
  • std :: auto_ptr: Obsoleto nunca se usa.
  • std :: unique_ptr: puntero de Singleton que transfiere la propiedad en la asignación.
  • std :: shared_ptr: puntero contado de referencia que no transfiere la propiedad en la asignación pero incrementa su recuento de referencia. Cuando todas las referencias abandonan el alcance o están explícitamente std::shared_ptr::reset se llama al deallocator subyacente.
  • std :: weak_ptr: un subtipo std::shared_ptr que no incrementa el recuento de referencia y se invalida cuando ya no existe su std::shared_ptr . Puede volver y referencia no válida. Siempre revise antes de usar.

EJEMPLOS DE EQUIVALENTE DE PUNTO CRUDO

Recuento de referencias, implementaciones de caché: std::map<std::string, std::pair<long, BITMAP*> > _cache;

Singletons con transferencia de propiedad:

class Keyboard { public: //... static Keyboard* CreateKeyboard(); ~Keyboard(); //... private: //... Keyboard(); static Keyboard* _instance; //... };

Contenedores agregados, no propiedad: Gráficos y árboles de partición espacial, contenedores iterativos, etc.

Contenedores compuestos, propiedad: objetos grandes.

--EDITAR--

Mientras trabajaba, encontré un caso interesante, DeadMG señaló que se supone que los punteros inteligentes se usan como abstracciones fáciles para cuidar la gestión de recursos; ¿Qué pasa con los objetos de ámbito de archivo que no se pueden crear en el montón en el punto de declaración, sino que deben crearse más adelante?


¿Qué idioma se supone que debe reemplazar cada puntero inteligente?

Todos y cada uno de ellos, alguna vez, implicaron destruir el recurso apuntado a. Así que en otras palabras, prácticamente todos ellos. No se me ocurren expresiones idiomáticas que incluyan punteros en bruto que no impliquen la destrucción de un recurso apuntado. Cualquier otro uso no es realmente un modismo, es simplemente "Usar un puntero".