¿Cómo puedo lanzar entre void* y boost shared ptr?

Tengo estas lineas:

typedef boost::shared_ptr<A> A_SPtr;
void *f(void* var){ ...

y quiero ser capaz de hacer algo como esto:

A_SPtr instance = (void*)(var);

¿Cómo puedo hacerlo? Además, ¿cómo puedo convertir el sentido contrario de shared_ptr a void*?

preguntado el 27 de julio de 12 a las 18:07

El propósito de un puntero inteligente es poseer memoria asignada en montón. p.ej A_SPtr instance = new A(); -

de shared_ptr a void - void* ptr = s_ptr.get(); -

@ AJG85, el puntero se asignó fuera de la función, y quiero pasarlo como un vacío * y luego volver a colocarlo en shared_ptr dentro de la función:

¿Cuál es su caso de uso real? Hay varias formas diferentes de hacer esto (enviar un puntero al puntero compartido a un void *, Utilizar shared_from_thisy otros) y la forma correcta depende de lo que esté tratando de lograr. -

@David Schwartz este método f es una rutina de un subproceso (usando pthread) que recibe un puntero compartido en forma de void* y luego quiero devolverlo al puntero compartido para usar los métodos de su clase:

2 Respuestas

Simplemente emita punteros a punteros compartidos hacia y desde void *.

  1. shared_ptr a void *:

    f (reinterpret_cast<void *>;(&A_SPtr));
    
  2. void * de nuevo a shared_ptr:

    A_SPtr instance = * reinterpret_cast(boost::shared_ptr<A>*)(var);
    

AVISO: Esto pasa un puntero al puntero compartido al hilo. Esto no funcionará si el puntero compartido no existe durante la vida útil de la función de subproceso; de lo contrario, el subproceso tendrá un puntero a un objeto (el puntero compartido) que ya no existe. Si no puede cumplir con ese requisito, pase un puntero a un Un nuevo shared_ptr y delete cuando el hilo haya terminado con él. (O usar boost:bind que funciona con punteros compartidos directamente).

contestado el 20 de mayo de 16 a las 22:05

@David Schwartz hubo alguien que sugirió llamar a var.get() para obtener su vacío * ... ¿sabe si funciona? Además, ¿quisiste escribir f (reinterpret_cast (&var)); ? - Yonatan Nir

Las get La función obtiene el puntero al objeto desde el puntero compartido. La pregunta pregunta cómo recuperar el puntero compartido. (Es por eso que pregunté cuál era el caso de uso. Dijiste "quiero devolverlo al puntero compartido".) Sin embargo, realmente deberías usar boost :: enlazar. - David Schwartz

@cppguy: Estoy de acuerdo. Probablemente deberías crear un new shared_ptr para pasar al hilo y tener el hilo delete cuando esté hecho. O, mejor aún, usa boost::bind que hace todo eso por ti. - David Schwartz

@user18853 reinterpret_cast<void*>(new std::shared_ptr<A>(A_SPtr)) y pasarlo al hilo. En el hilo, lo lanzas de nuevo a std::shared_ptr<A>* y delete cuando haya terminado con él. - David Schwartz

@ usuario18853 Correcto. Y este es un patrón común para pasar algo a un hilo. Lo asigna en el montón, le pasa un puntero al subproceso, el subproceso devuelve el puntero al tipo correcto y lo elimina cuando termina. - David Schwartz

Siempre que esté seguro de que está bien asumir la propiedad del void* te pasó en f, que el void* de hecho se refiere a un A objeto, y conoce la forma correcta de limpiar, entonces puede continuar y usar un puntero inteligente para asumir la propiedad:

typedef boost::shared_ptr<A> A_SPtr;

void *f(void *var){
    A_SPtr instance(static_cast<A*>(var));
}

Editar: no está claro en la pregunta, pero algunos comentarios indican que en realidad está tratando de pasar un puntero inteligente a través de una interfaz 'genérica' que usa void*. Lo haces de la misma manera que lo harías para cualquier tipo:

void *f(void *var){
    A_SPtr *instance = static_cast<A_SPtr *>(var);
}

Y pasas el puntero como:

A_SPtr a;
f(&a);

Al igual que con cualquier puntero, debe asegurarse de que la duración del objeto sea suficiente para que el puntero sea válido cuando f lo recibe.

Respondido 27 Jul 12, 19:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.