2008-09-26 13 views
6

Supongamos que tengo una clase foo, y desea utilizar un std :: mapa para almacenar algunos impulso :: shared_ptrs, por ejemplo:impulso :: shared_ptr contenedor estándar

class foo; 

typedef boost::shared_ptr<foo> foo_sp; 
typeded std::map<int, foo_sp> foo_sp_map; 

foo_sp_map m; 

Si agrego un nuevo foo_sp a la pero la clave utilizada ya existe, ¿se eliminará la entrada existente? Por ejemplo:

foo_sp_map m; 

void func1() 
{ 
    foo_sp p(new foo); 
    m[0] = p; 
} 

void func2() 
{ 
    foo_sp p2(new foo); 
    m[0] = p2; 
} 

¿Se liberará el puntero original (p) cuando se sustituya por p2? Estoy bastante seguro de que será, pero pensé que valía la pena preguntar/compartir.

+0

Pregunta modificada: debe ser shared_ptr not auto_ptr, – Rob

+0

Es "should _have_" –

Respuesta

7

En primer lugar, el título de la pregunta dice boost :: auto_ptr, pero en realidad se quiere decir impulsar :: shared_ptr

Y sí, se liberará el puntero original (si no se comparten sin más referencias a él).

0

Dado que stackoverflow no me permite comentar, simplemente responderé. :/

No veo que "p" salga del alcance, por lo que se liberará el objeto al que apunta no. "p" aún lo señalará.

+0

Debería haber dejado en claro que p estaría fuera de alcance cuando se creó p2. – Rob

+0

La restricción para los nuevos usuarios al comentar es evitar que los nuevos usuarios comenten, ¡no alentarlos a eludir el sistema! –

1

Depende de lo que ocurre en su sección ...

su clase contenedora contiene copias de instancias de foo_sp, cuando se ejecuta la copia de m[0] = p2;p que estaba originalmente en ese lugar se sale del ámbito. En ese momento se eliminará si no hay otro foo_sp se refiere a él.

Si la copia que se declaró en la segunda línea foo_sp p(new foo); todavía está presente, la memoria no se desasignará. La entrada se eliminará una vez que se hayan eliminado todas las referencias a ella.

Cuestiones relacionadas