Pregunta

Suponga que tengo una clase foo, y deseo usar un std :: map para almacenar algunos boost :: shared_ptrs, por ejemplo:

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 al mapa 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 reemplace por p2? Estoy bastante seguro de que lo será, pero pensé que valía la pena preguntar / compartir.

¿Fue útil?

Solución

Primero, el título de su pregunta dice boost :: auto_ptr, pero en realidad quiere decir boost :: shared_ptr

Y sí, el puntero original se liberará (si no hay más referencias compartidas)

Otros consejos

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

Su clase de contenedor contiene copias de instancias de foo_sp, cuando ejecuta m [0] = p2; la copia de p que fue originalmente en ese lugar queda fuera de alcance. En ese momento se eliminará si no hay otro foo_sp que se refiera a él .

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

Dado que stackoverflow no me permitirá comentar, solo responderé. : /

No veo " p " fuera del alcance, por lo que el objeto señalado por él no se liberará. " p " aún lo señalará.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top