Comparar débil_ptr con el puntero sin procesar no funciona, buscando una alternativa

Tengo una clase SpriteManager que carga y almacena en caché los sprites por mí, y elimina los sprites no utilizados del caché. Esa es la idea de todos modos, estoy un poco atascado. tengo un map<string,weak_ptr<ALLEGRO_BITMAP>> donde estoy almacenando los sprites, y uso el punto débil para generar shared_ptr's. Ahora estoy tratando de usar un borrador que también elimina el mapa de bits del mapa, se ve así (no funciona, obviamente):

[&bitmaps](ALLEGRO_BITMAP* bmp){
        for(auto it = bitmaps.begin(); it!=bitmaps.end(); ++it) {
            if((*it).second == bmp) {
                bitmaps.erase(it);
                al_destroy_bitmap(bmp);
                break;
            }
        }
}

bitmaps siendo el mapa del que estaba hablando. Por supuesto que no puedo comparar (*it).second y bmp, pero tampoco puedo bloquear el débil_ptr porque estoy en el eliminador. ¿Realmente no tengo otra opción que mantener tanto el puntero débil como el crudo?

preguntado el 31 de julio de 12 a las 13:07

No debería haber ninguna necesidad de eliminar el puntero sin procesar usted mismo. Los shared_ptrs que lo usan se encargarán de la eliminación cuando el recuento de referencia llegue a cero. Por supuesto, si necesita un eliminador especial, debe proporcionarlo durante la construcción de share_ptr. -

Necesito eliminar el mapa de bits de mi mapa cuando se elimina el mapa de bits, pensé que lo expresé con bastante claridad. Y ESTOY proporcionando un borrador especial, el problema está en su definición. -

1 Respuestas

Guarde el iterador en el punto débil del mapa en el eliminador junto con &bitmaps. luego eliminar con él.

[&bitmaps, iter](ALLEGRO_BITMAP* bmp){
    bitmaps.erase(iter);
    al_destroy_bitmap(bmp);
}

Respondido 31 Jul 12, 13:07

Espere, ¿el iterador sigue siendo válido si el mapa se modifica mientras tanto? - Cúbico

@Cubic sí, para std::map esto está garantizado. - yuri kilochek

@Cubic, yuri kilocheck: no sigue siendo válido si se elimina el elemento señalado por el iterador, por lo que la respuesta es no. Mirar aquí para las reglas de invalidación (en c ++ 03, pero dudo que haya cambiado para c ++ 11) - Oso pardo

@Grizzly, obviamente, si elimina el elemento al que hace referencia el iterador, el iterador se invalida. Supuse que por modificación te referías a insertar/borrar otros elementos. Pero ¿por qué te preocupas por eso? ¿Se puede borrar este punto débil del mapa desde otro lugar? - yuri kilochek

No, no puede. Y, por supuesto, el iterador no es válido si se borra el elemento, tampoco me refería a eso. Tu respuesta funcionó a las mil maravillas para mí. Supongo que Grizzly solo quería dejar claro que lo que dijiste no era técnicamente correcto porque hay operaciones de modificación que invalidan los iteradores o algo así. - Cúbico

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.