2011-01-21 9 views
6

¿Se puede impulsar :: smart_ptr como scoped_ptr y shared_ptr en contenedores estándar como std :: map?¿Se puede impulsar :: smart_ptr en contenedores estándar?

class SomeClass 
{ 
    std::map<int,boost::scoped_ptr<SomeOtherClass> > a_map; 
}; 

Como boost::smart_ptr can be used for polymorphism, ¿es cierto que en este caso así? ¿La destrucción del contenedor provocará la destrucción correcta de las subclases?

+0

lo mismo que antes: ¿lo has probado? – BatchyX

+0

@BatchyX - no. Es bastante refactorización en mi caso, así que más bien pregunto. Además, si la respuesta no está en StackOverflow, debería ser :) – Jonathan

+0

Estado allí, hecho eso. Pero he aprendido de ello, en la mayoría de los casos puede escribir 20-30 programas de prueba de línea que verificará/invalidarán una idea en menos de 5 minutos. 'struct test {~ test() {std :: cout <<" ~ test "<< std :: endl; }}; int main() {vector > v; v.push_back (make_shared ()); } '(o algo en esta línea, es difícil de escribir el código en un comentario). Luego compile y verifique si se llaman o no los destructores. Inténtalo de nuevo con 'scoped_ptr' y verifica si el código incluso se compila. Agregue un par de otras operaciones ('resize', ...) y verifique. –

Respuesta

20

scoped_ptr no se puede utilizar en contenedores estándar porque no se puede copiar (lo que requieren las interfaces de los contenedores). shared_ptr se puede utilizar, sin embargo.

Si no puede usar C++ 11 y ya está utilizando aumentar, considere el pointer containers que funcionará algo mejor que un contenedor de punteros compartidos.

Si está utilizando C++ 11, considere un contenedor de unique_ptr, que debería funcionar de forma similar a los contenedores de puntero de boost.

+0

@John Dibling: Win? ¿Desde cuándo estamos en una competencia? :) –

Cuestiones relacionadas