¿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
Respuesta
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
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.
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. –
@BenVoigt: pero se proporciona y se puede utilizar. – Puppy
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). –
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();
}
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
{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
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?
- 1. C++: Punteros y alcance
- 2. ¿Por qué std :: cout convierte los punteros volátiles en bool?
- 3. ¿Para qué sirven los punteros?
- 4. ¿Qué está sucediendo con los punteros en este fragmento?
- 5. ¿Por qué el impulso está tan fuertemente modelado?
- 6. ¿Para qué sirven los punteros en C++?
- 7. ¿Por qué no hay impulso :: copy_on_write_ptr?
- 8. ¿Por qué autoconf no detecta el impulso correctamente?
- 9. ¿Por qué los métodos ruby no tienen alcance léxico?
- 10. ¿Por qué tenemos punteros distintos de vacío?
- 11. ¿Por qué impulso :: variante no proporciona el operador! =
- 12. calificador const para los punteros a punteros
- 13. ¿Por qué es el alcance de si y los delegados de esta manera en C#
- 14. ¿Por qué el temporizador local capturado no saldrá del alcance?
- 15. ¿Por qué no puedo usar el gráfico de impulso write_graphviz con OutEdgeList = listS y VertexList = listS
- 16. ¿Para qué sirven los punteros const (a diferencia de los punteros para crear objetos)?
- 17. Cómo devolver punteros inteligentes (shared_ptr), por referencia o por valor?
- 18. Acerca de los punteros en Objective-C
- 19. matrices y matrices a funciones como punteros y punteros Pasando a los punteros en C
- 20. c tipos incompatibles en la asignación, ¿problema con los punteros?
- 21. Hilos impulso con CLR
- 22. Punteros para comenzar con los módulos SilverStripe
- 23. ¿Por qué las cualificaciones de alcance redundante son compatibles con el compilador y es legal?
- 24. Punteros de 32 bits con el ISA x86-64: ¿por qué no?
- 25. ¿Hay un impulso :: weak_intrusive_pointer?
- 26. ¿Por qué la función impulso asio expires_from_now() cancelar un deadline_timer?
- 27. ¿Los punteros son tipos primitivos en C++?
- 28. mantener el alcance con javascript
- 29. operador subíndice sobre los punteros
- 30. Introducción a los punteros inteligentes en C++
http://www.boost.org/doc/libs/1_36_0/libs/smart_ptr/scoped_ptr.htm#Handle/Body –