¿Es posible obtener un puntero sin formato de boost :: weak_ptr? El método shared_ptr de Boost tiene el método get() y el operador "->". ¿Hay alguna razón detrás de que weak_ptr no tenga la misma funcionalidad?¿Puedo obtener un puntero sin formato del weak_ptr de boost?
Respuesta
A weak_ptr
contiene una referencia no propietaria, por lo que el objeto al que se refiere puede que ya no exista. Sería intrínsecamente peligroso utilizar un puntero sin procesar en un weak_ptr
.
El enfoque correcto es promocionar weak_ptr
a shared_ptr
usando weak_ptr::lock()
y obtener el puntero de eso.
El Boost weak_ptr
documentation explica por qué no sería seguro proporcionar get()
funcionalidad como parte de weak_ptr
, y tiene ejemplos de código que pueden causar problemas.
Primero debe derivar el shared_ptr del weak_ptr antes de obtener el puntero sin formato.
Puede llamar lock para obtener el shared_ptr, o el constructor shared_ptr:
boost::weak_ptr<int> example;
...
int* raw = boost::shared_ptr<int>(example).get();
Tal como está escrito, esto no es seguro: podría quedar con un puntero colgante si el objeto se elimina cuando se destruye el 'shared_ptr' temporal. Debes mantener presionado el 'shared_ptr' mientras uses el puntero sin formato. –
Ésta es una vieja pregunta y la respuesta aceptada es bueno, por lo que dudó en publicar otra respuesta, pero una cosa que parece falta es un buen ejemplo de uso idiomático:
boost::weak_ptr<T> weak_example;
...
if (boost::shared_ptr<T> example = weak_example.lock())
{
// do something with example; it's safe to use example.get() to get the
// raw pointer, *only if* it's only used within this scope, not cached.
}
else
{
// do something sensible (often nothing) if the object's already destroyed
}
una ventaja clave de este lenguaje es que el puntero fuerte tiene como alcance el bloque si-verdadero, lo que ayuda a evitar el uso accidental de una referencia no inicializado, o posesión una referencia fuerte alrededor de larga de lo que realmente se requiere.
- 1. boost :: python y weak_ptr: cosas que desaparecen
- 2. puntero sin formato C++ y std :: shared_ptr
- 3. Cómo pasar un puntero sin formato a Boost.Python?
- 4. Sintaxis aprobada para la manipulación del puntero sin formato
- 5. orden de clasificación de boost :: weak_ptr after expiring?
- 6. ¿Cómo puedo pasar boost :: shared_ptr como un puntero a una función de subproceso de Windows?
- 7. Crear shared_ptr desde el puntero sin formato
- 8. ¿Puedo escribir un functor de C++ que acepte tanto un puntero sin formato como un puntero inteligente?
- 9. Puntero NULL con boost :: shared_ptr?
- 10. Obtener datos de entrada sin formato
- 11. ¿Puedo obtener un puntero a un valor repetidor actual
- 12. Boost: desreferencia un argumento de plantilla si es un puntero
- 13. puntero débil a este en el constructor
- 14. Obtener texto sin formato de un texto RTF
- 15. Cómo obtener un texto sin formato Django página de error
- 16. ¿Cuáles son las operaciones soportadas por puntero sin formato y puntero de función en C/C++?
- 17. ¿Cómo puedo obtener un archivo sin eliminarlo del disco?
- 18. Usando un puntero a un analizador en boost :: spirit
- 19. demote boost :: function a un puntero de función simple
- 20. ¿Cómo puedo liberar un vector de puntero?
- 21. Obtener el tamaño del puntero en C
- 22. Uso de boost :: formato en un impulso :: lambda
- 23. static_pointer_cast para weak_ptr
- 24. Contenedor de shared_ptr pero iterar con punteros sin formato
- 25. ¿Cómo funciona weak_ptr?
- 26. ¿Cómo obtener un nuevo puntero en Java?
- 27. Obtener texto sin formato de QString con etiquetas HTML
- 28. Use javascript para obtener el código html sin formato
- 29. ¿Cómo obtener html sin formato de cadena en jquery?
- 30. C++ - boost obtener pregunta
De hecho, puede dejar un puntero colgante si obtiene un puntero sin formato para un 'shared_ptr' que también se destruye después ... en caso de Multithread puede incluso dejar un puntero colgando en la ejecución de el código 'if (! weak.expired()) weak-> run();' como el objeto apuntado podría destruirse entre la prueba y la ejecución del método (supongo que el método está sincronizado correctamente) ... –
@ Matthieu: por supuesto * puede *, del mismo modo que puede dejar un puntero colgante si 'elimina' explícitamente un objeto pero mantiene un puntero al mismo. El punto de tener que promocionar un 'weak_ptr' a' shared_ptr' es que lo alienta a que alcance correctamente el uso del puntero sin formato, siguiendo las reglas que normalmente usa para 'shared_ptr :: get'. No habría una forma equivalente de delimitar correctamente el uso de un puntero sin formato obtenido directamente de un 'weak_ptr'. –