2009-02-02 15 views

Respuesta

123

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.

+0

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

+0

huevas: sé de eso, solo necesitaba saber acerca de obtener :). Gracias Adam! : D –

+1

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

27

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.

+0

Me gustó tu respuesta un poco más que Adams, lo siento, Adam. –

+3

@ 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. –

+0

estoy usando get pero todavía me gusta esta respuesta. en su mayoría, BC recomienda tanto qué hacer como NO hacer. –

Cuestiones relacionadas