2012-05-24 12 views
8

¿Cuál es el objetivo del puntero con el objetivo? a mi entender, el puntero de alcance administra la memoria dentro de un bloque de código. Si quiero declarar una variable dentro de un bloque, solo puedo declararlo en una pila y no preocuparme por la limpieza.Por qué los punteros con alcance en el impulso

+0

http://www.boost.org/doc/libs/1_36_0/libs/smart_ptr/scoped_ptr.htm#Handle/Body –

Respuesta

1

El punto es que puede crear y limpiar un puntero dentro de un cierto alcance léxico. Esto puede ser útil en una variedad de situaciones, y le asegura que no tiene pérdidas de memoria, al olvidar un delete si tuviera que usar new explícitamente, lo cual no es recomendable.

usted debe tener en cuenta que el boost::scoped_ptr es no copiable, y por lo tanto posee su recurso en su totalidad, para toda la duración de su vida útil. Esto también lo hace más seguro que boost::shared_ptr, ya que evita copiar el recurso o compartirlo accidentalmente.

{ //Some Scope 

    boost::scoped_ptr<int> i_ptr; 
    // do something with pointer 

} // leave scope, pointer is cleaned up 
4

No, si es de tamaño o tipo dinámico. Además, los punteros con ámbito se pueden intercambiar, y en C++ 11 unique_ptr se pueden mover, por lo que no tienen un alcance estricto.

+1

Excepto que "La razón principal para use 'scoped_ptr' en lugar de' auto_ptr' para que los lectores de su código sepan que usted tiene la intención de que "la adquisición de recursos sea inicialización" para que se aplique solo para el alcance actual y no tenga intención de transferir la propiedad "... parece' 'swap 'no es un uso previsto. –

+0

@BenVoigt: pero se proporciona y se puede utilizar. – Puppy

+2

Aquí hay [un hilo viejo] (http://lists.boost.org/Archives/boost/2002/09/36359.php) discutiendo por qué 'swap' se convirtió en un requisito (básicamente,' scoped_ptr' puede usarse como miembro de una clase copiable). –

0

generalmente las pilas de hilo tienen límites de memoria (ver el tamaño de las hebras).

También a veces el puntero puede haber sido enviado desde fuera y debe eliminarse en este ámbito (por ejemplo, si se lanza una excepción, no se ejecutará ninguna llamada de eliminación debajo de esa línea). Así que hay alguna manera de auto-mágicamente limpiar el puntero

void foo(Object*obj) 
{ 
    //this will ensure that object gets cleaned up even if doFoo() throws an exception 
    boost::scoped_ptr<Object> objCleaner(obj); 
    obj->doFoo(); 
} 
+0

Puedo declarar el puntero en la pila y se limpiaría automáticamente cuando la función salga del alcance, ya sea con éxito o por excepción. ¿Correcto? – Jimm

+0

{X * x = & someObj; } esto no hará que se borre el puntero x cuando salga del alcance. someObj se eliminará cuando salga del alcance. {X * y = new X();} este tipo de código requerirá ptr con alcance para la limpieza automática – mohaps

2

diferencia de los datos basados ​​en la pila, scoped_ptr tiene un miembro de reset() - en otras palabras, se puede construir/destrucción al contenido de su corazón. Con esto, puede usar un puntero nulo (técnicamente operator unspecified-bool-type) como una bandera que indica si hay o no un objeto construido en un momento dado. También le permite secuenciar la construcción/destrucción independientemente del alcance de la variable si es necesario.

Además, considere que puede declarar un scoped_ptr como miembro de la clase, no solo como una variable de pila. El docs sugiere usar scoped_ptr para implementar el idioma del mango/cuerpo (para ocultar los detalles de implementación de la clase).

Por último, importancia en el punto de DeadMG "No si es de tipo dinámico", puede utilizar scoped_ptr para implementar una operación polymorphic:

{ 
scoped_ptr<Base> a(mode ? new DerivedA : new DerivedB); 
a->polymorphic_function(); 
} 

En realidad no es posible hacer esto con sencilla stack- asignación basada


También vea aquí: C++0x unique_ptr replaces scoped_ptr taking ownership?

+0

'boost :: variant '. :) – GManNickG

+0

@GManNickG: No creo que boost :: variant ofrezca un buen reemplazo para el polimorfismo a través de scoped_ptr - aunque interesante. ¡Gracias! – nobar

+0

¿Por qué no lo crees? – GManNickG

Cuestiones relacionadas