Pregunta

Tengo 2 estáticas objetos en 2 diferentes dlls :

Un objeto Recursos (que es un singleton), y un objeto User . Usuario objeto en su destructor tiene que acceder a los recursos del objeto.

¿Cómo puedo forzar Recursos de objetos que no se destruye antes objeto Usuario?

¿Fue útil?

Solución

Los objetos globales se destruyen cuando se descarga el archivo DLL correspondiente. Así como su DLL 'Usuario' es probablemente dependiente de la DLL 'Recursos', que está en problemas: 'recurso' siempre va a ser destruido antes de 'usuario'

.

También estoy interesado por una buena respuesta a esta pregunta, si uno existe. Hasta ahora, estoy usando una función de limpieza que debe ser llamado por aplicación antes de su romance, y sólo mantener el código inofensivo en los destructores.

Otros consejos

Si usted es capaz de poner ese 2 variables globales en el mismo archivo DLL que no es la misma historia. Según lo dicho por Jem en su propia respuesta, orden Detachement DLL no está garantizada por el sistema. Por lo tanto es posible que tenga un gran problema cuando después de haber separado 2 Dlls. No soy un gurú del sistema de Windows, pero echando un vistazo en Google, encontré bloggers MSDN que le dice que tenían el mismo problema con ninguna buena solución para hacer frente a ella.

I que son capaces de ponerlos en una misma DLL, en mi opinión, la solución es fácil, en ese caso no es necesario abordar la cuestión "no garanteed fin DLL Detachement" (sin solución por lo que yo entiendo) .
Pero entonces usted todavía tiene que hacer frente a un nuevo problema: la destrucción orden global variable no está garantizada por el lenguaje C ++. Pero éste se puede abordar:

es necesario utilizar algún tipo de Couting referencia. un impulso :: shared_ptr puede hacer el truco.

Declárelo global y definir de esta manera:

boost::shared_ptr my_resource_ptr ( new Resource() ); // new operator is important here!

Luego hay que modificar la aplicación del usuario a Tienda su propio shared_ptr:

class User
{
    ...
    boost::share_ptr a_resource_ptr;
    ...
};

Mientras todo una de la instancia de usuario no se destruye, los va a 'mantener' la instancia de recurso, y así evitar que sea borrado prematuraly, a pesar de que la shared_ptr global podría haber sido destruido.
La última instancia de usuario se está destruyendo (undirectly) eliminar la instancia de recurso.

Cualquiera que sea la referencia de recuento que utilice, ComPtr, su propio, que debe hacer el truco.

No creo que se puede cambiar el orden de destrucción de las variables globales que se encuentran en diferentes módulos. ¿Hay alguna posibilidad de añadir un poco de recuento de referencias?

En el caso de que realmente desea conseguir 2 separados Dlls que puede tener algunas sugerencias para usted: usted puede considerar el uso de FreeLibrary() de API de Windows. Según lo indicado por MSDN LoadLibrary() decrementa una contador de referencia para el DLL que se descarga cuando el contador llega a 0.

Desventaja: el uso de GetProcAddress() implica que va a cargar con main() ( MSDN enlace ) y la función de llamar de esta biblioteca implica que está utilizando el DllMain() función, que puede conducir a código muy feo. Y puede implicar algún cambio en su código también - como conseguir poiting variable global a las funciones de la DLL con el fin de almacenar la dirección en que funciona cada ...

Si desea ponerlo en práctica:

  1. debe cargar y liberar a la biblioteca de su DLL_PROCESS_DETACH función de su proceso,
  2. y también cargar y liberar a la biblioteca de la DLL implenting la clase de usuario. Implementarlo en el <=> función de esta DLL, cuando la razón es <=> (ver MDSN de DllMain enlace .

Por lo tanto, se descarga la biblioteca "Recursos" sólo una vez la biblioteca "Usuario" tiene acabado con él.

Tener una oportunidad si se quiere y que me diga si funciona como nunca he implementado ella ..

PS: He segunda respuesta posta a su pregunta para obtener una separación significativa entre las dos respuestas como yo (intento) Detalle ambos. No quiero que le permite mezclar para arriba y confundo ...

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