Tengo algo así como shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe))
Ahora necesito llamar a la función estilo C que requiere un puntero a Type
. ¿Cómo lo obtengo de shared_ptr
?obteniendo un ptr normal de shared_ptr?
Respuesta
Utilice el método get()
:
boost::shared_ptr<foo> foo_ptr(new foo());
foo *raw_foo = foo_ptr.get();
c_library_function(raw_foo);
Asegúrese de que su shared_ptr
no sale del alcance antes de que la función de la biblioteca se hace con ella - de lo contrario podría dar lugar a la maldad, ya que la biblioteca puede tratar de hacer algo con el puntero después de que ha sido eliminado. Tenga especial cuidado si la función de biblioteca mantiene una copia del puntero sin procesar después de que vuelve.
Otra manera de hacerlo sería utilizar una combinación de los operadores &
y *
:
boost::shared_ptr<foo> foo_ptr(new foo());
c_library_function(&*foo_ptr);
Aunque personalmente prefiero utilizar el método get()
(que es realmente la respuesta correcta), una de las ventajas que esto tiene es que se puede utilizar con otras clases que sobrecargar operator*
(desreferencia del puntero), pero no proporcionan un método get()
. Puede ser útil en la plantilla de clase genérica, por ejemplo.
Me gustó tu respuesta un poco más que Adams, lo siento, Adam. –
@ acidzombie24 - No estoy seguro de por qué te gusta esto mejor. El método Get() es mejor usar en probablemente el 99% o más de los casos. –
estoy usando get pero todavía me gusta esta respuesta. en su mayoría, BC recomienda tanto qué hacer como NO hacer. –
- 1. Obteniendo un impulso :: shared_ptr para este
- 2. Explicit casting de ptr a "ptr to a ptr"
- 3. ¿Debo verificar boost :: shared_ptr o std :: shared_ptr antes de usarlo?
- 4. Uso apropiado de shared_ptr?
- 5. DWORD uso ptr confusión
- 6. ¿Qué significa `dword ptr`?
- 7. std :: shared_ptr y inicializador
- 8. Pregunta de sintaxis básica para shared_ptr
- 9. ¿Está bien utilizar boost :: shared ptr en la interfaz DLL?
- 10. Eliminación explícita de un shared_ptr
- 11. Boost asignación Shared_Ptr
- 12. C++ static classes & shared_ptr memory leaks
- 13. Crear un pcl :: PointCloud :: Ptr desde un pcl :: PointCloud
- 14. Separar un puntero de un shared_ptr?
- 15. Boost shared_ptr desreferencia costo
- 16. convertir de forma segura (vector de shared_ptr a objetos) a (vector de shared_ptr a los objetos constantes)
- 17. C++ shared_ptr of stack object
- 18. ¿Cuál es la diferencia entre int * ptr e int * ptr en C?
- 19. shared_ptr magia :) :)
- 20. impulso shared_ptr
- 21. ¿Por qué printf ("% s", ptr) puede desreferenciar un vacío *?
- 22. GCC Inline-ensamblaje: llamar DWORD PTR
- 23. Uso de std :: shared_ptr
- 24. Creando un archivo seguro sin hilos shared_ptr
- 25. Cómo eliminar intencionalmente un impulso :: shared_ptr?
- 26. prueba si un shared_ptr es NULO
- 27. ¿Cómo debería devolver * esto con un shared_ptr?
- 28. ¿Es posible pasar un impulso shared_ptr de C++ a Python y volver a C++
- 29. Downcasting shared_ptr <Base> to shared_ptr <Derived>?
- 30. ¿Debo convertir shared_ptr en weak_ptr cuando se pasa a un método?
tal vez debas notar algo sobre que shared_ptr está fuera del alcance antes de que c_library_function haya hecho lo suyo con raw_foo. – falstro
huevas: sé de eso, solo necesitaba saber acerca de obtener :). Gracias Adam! : D –
Hola @Adam Rosenfield, ¿podrías explicar qué sucede en un escenario en el que se produce una excepción dentro de 'c_library_function'. Eso significa que el raw_foo se deja colgado? o ¿foo_ptr sigue adelante y elimina el raw_foo, ya que raw_foo está en poder de foo_ptr? – thassan