Tengo una aplicación C++ que hace un uso extenso de los punteros para mantener estructuras de datos bastante complejas. La aplicación realiza simulaciones matemáticas en enormes conjuntos de datos (que podrían tomar varios GB de memoria) y se compila utilizando Visual Studio de Microsoft.Introducción a los punteros inteligentes en C++
Ahora estoy reelaborando una parte importante de la aplicación. Para reducir errores (punteros colgantes, fugas de memoria, ...) quisiera comenzar a usar punteros inteligentes. Sacrificar la memoria o el rendimiento es aceptable siempre que sea limitado.
En la práctica, la mayoría de las clases se mantienen en grupos grandes (un grupo por clase) y aunque las clases pueden referirse entre sí, podría considerar el grupo como propietario de todas las instancias de esa clase. Sin embargo, si el grupo decide eliminar una instancia, no quiero que ninguna de las otras clases que aún hacen referencia a la instancia eliminada tenga un puntero colgante.
En otra parte guardo una colección de punteros a las instancias que son entregadas por otros módulos en la aplicación. En la práctica, los otros módulos mantienen la propiedad de la instancia aprobada, pero en algunos casos, los módulos no quieren ocuparse de la propiedad y solo quieren pasar la instancia a la colección, diciéndole "ahora es tuyo, gestiónalo".
¿Cuál es la mejor manera de comenzar a introducir punteros inteligentes? Simplemente reemplazar punteros [al azar] con punteros inteligentes no parece una forma correcta, y probablemente no ofrece todas las ventajas (o ninguna de ellas) de los punteros inteligentes. Pero, ¿qué es un método mejor?
¿Qué tipos de indicadores inteligentes debo investigar más? A veces uso std :: auto_ptr para la desasignación de la memoria asignada localmente, pero parece que se ha depreciado en C++ 0x. ¿Es std :: unique_ptr una mejor alternativa? ¿O debería ir directamente a punteros compartidos u otros tipos de punteros inteligentes?
La pregunta Replacing existing raw pointers with smart pointers parece similar, pero en lugar de preguntar qué tan fácil es, me pregunto cuál sería el mejor enfoque y qué tipo de punteros inteligentes son los más adecuados.
Gracias de antemano por sus ideas y sugerencias.
+1 buenos consejos. Tienes que estar haciendo un * lote * de creación/destrucción de objetos o copia de punteros para ver una diferencia de rendimiento entre 'shared_ptr' y' intrusive_ptr'. – Doug