Pregunta

¿Es válido para desarrollar una DLL en C ++ que devuelve impulso compartido punteros y los utiliza como parámetros?

Así que, ¿está bien para exportar las funciones de esta manera?

1.) boost::shared_ptr<Connection> startConnection();
2.) void sendToConnection(boost::shared_ptr<Connection> conn, byte* data, int len);

En especial:? ¿Funciona el recuento de referencia a través de fronteras DLL o pudiera ser el requisito de que EXE y DLL utilizan el mismo tiempo de ejecución

La intención es superar los problemas con la propiedad de objetos. Por lo que el objeto se elimina cuando ambos DLL y EXE no hacen referencia a él más.

¿Fue útil?

Solución

Según Scott Meyers en efectivo de C ++ (3ª edición), shared_ptrs son seguros a través de fronteras DLL. El objeto shared_ptr mantiene un puntero al destructor de la DLL que lo creó.

  

En su libro en la casilla 18, afirma: "Una característica especialmente agradable de   TR1 :: shared_ptr es que utiliza automáticamente su Deleter por triple   eliminar a otro error del cliente potencial, el "problema cruzada DLL".   Este problema surge cuando se crea un objeto utilizando nueva en una   enlazada dinámicamente biblioteca (DLL), pero se suprime en un DLL diferente. En   muchas plataformas, tales cruzada DLL nuevos / borrar pares conducen a tiempo de ejecución   errores. TR1 :: shared_ptr evitar el problema, debido a que su Deleter por defecto   usos eliminar de la misma DLL donde se crea el TR1 :: shared_ptr ".

Tim Lesher tiene una Gotcha interesante para observar, sin embargo, que él menciona aquí . Es necesario asegurarse de que la DLL que creó el shared_ptr no se descarga antes de la shared_ptr finalmente sale del ámbito. Yo diría que en la mayoría de los casos esto no es algo que tienes que ver, pero si va a crear archivos DLL que será débilmente acoplados entonces recomendaría contra el uso de un shared_ptr.

Otra desventaja potencial es asegurarse de que ambas partes se crean con versiones compatibles de la biblioteca de impulso. shared_ptr de impulso se ha mantenido estable durante mucho tiempo. Al menos desde 1,34 que ha sido compatible TR1.

Otros consejos

En mi opinión, si no es en la norma y no es un objeto / mecanismo previsto por su biblioteca, entonces no debería ser parte de la interfaz a la biblioteca. Usted puede crear su propio objeto de hacer el recuento de referencias, y tal vez usar impulsar debajo, pero no se debe exponer de forma explícita en la interfaz.

DLL de recursos hacen normalmente no propias - los recursos son propiedad de los procesos que utilizan la DLL. Usted es probablemente mejor de devolver un puntero sin formato, que luego se almacena en un puntero compartida en el lado llamante. Pero sin más información que es difícil estar 100% seguro de esto.

Algo de búsqueda de si expone punteros primas desde una interfaz de DLL. Te obliga a utilizar el CRT DLL compartida, memoria asignada en un CRT no puede cancelar la asignación de un CRT diferente. Si utiliza el CRT DLL compartida en todos sus módulos (DLL y exe), entonces usted está bien, todas comparten el mismo montón, si no se va a cruzar de CRT y el mundo será colapso.

Además de esta cuestión, estoy de acuerdo con la respuesta aceptada. La fábrica de creación probablemente no debería definir la propiedad y la gestión del ciclo de vida para el código de cliente.

No, no lo es.

El diseño de boost::shared_ptr<T> podría no ser la misma en ambos lados de la frontera DLL. (Diseño está influenciado por la versión del compilador, pragmas, y otras opciones del compilador, así como la versión actual del código fuente Boost embalaje.)

Sólo "diseño estándar" (un nuevo concepto en C ++ 11, en relación con el antiguo concepto "= datos simple y llano POD") tipos de forma segura se puede pasar entre los módulos por separado incorporados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top