En primer lugar, me doy cuenta de que esto contradice completamente el propósito de un shared_ptr. Estoy tratando con un código de biblioteca donde las instancias de un sistema de partículas esperan tener un shared_ptr pasado durante la construcción para establecer la textura utilizada para cada partícula. La cuestión es que ya construí el resto de mi programa de forma tal que mis texturas tienen propiedad concreta (si ese es el término correcto): TextureCache posee todas las texturas. Entonces necesito una forma de trabajar con esta clase ParticleSystem sin permitir que elimine mis texturas. Si tuviera que crear una instancia nueva como ParticleSystem(std::shared_ptr<Texture>&myTexture)
, intentaría destruir la textura después de su destrucción (que es una operación no deseada e inválida, ya que mis texturas ni siquiera se crean con new
).Pasar un objeto a una función esperando shared_ptr sin compartir la propiedad
La manera más limpia que veo alrededor de este problema es algo como esto:
- Crear una shared_ptr la celebración de la textura en la función que crea el ParticleSystem.
- Luego, con la colocación nueva, reconstruya el shared_ptr en la misma ubicación de memoria que el shared_ptr que acabo de crear. La textura ahora tendrá un recuento de referencias de 2.
- Cree el sistema de partículas.
- Deje que el shared_ptr quede fuera del alcance. Se llamará a su deconstructor ya que se asignó en la pila, y se reducirá el recuento de referencia solo por 1. Por lo tanto, el recuento de referencia para el objeto siempre será 1 mayor de lo que realmente es, y por lo tanto nunca se destruirá automáticamente.
Creo que esta solución es sólida, pero todavía se siente increíblemente hackosa. ¿Hay una mejor manera de resolver mi problema?
por qué no tener shared_ptrs en la memoria caché de la textura? –
@Vaughn que es factible, pero parece un innecesario nivel adicional de direccionamiento indirecto al seguir los punteros a las texturas en lugar de a las texturas en sí mismas y sería un uso indebido de punteros compartidos semánticamente ya que la caché de texturas sigue siendo responsable de decidir cuándo está bien para liberar la textura, no sería * compartir * propiedad. – Ponkadoodle