Dado: Ejecutable utiliza dll. Tienen diferentes tiempos de ejecución c/C++. ¿Qué restricciones existen en la interfaz entre ellos? Además usan el mismo compilador, la misma versión de Boost (pero diferentes libs de refuerzo precompilados).interfaz entre exe y dll con diferente biblioteca de tiempo de ejecución de C/C++
Entiendo que el tiempo de ejecución diferente puede tener diferentes montones. Por lo tanto, eliminar debe corresponder a nuevo del mismo montón.
Lo más importante es que no podemos pasar a través de objetos STL de interfaz porque cuando construimos exe el objeto STL se vincula con un tiempo de ejecución y cuando construimos dll el mismo objeto (si lo pasamos por referencia o copiamos vía interfaz) otro tiempo de ejecución. Y otro tiempo de ejecución puede tener una implementación diferente de ese objeto.
consideremos casos:
Creo que la siguiente es seguro. Dll exporta la función que tiene el parámetro: referencia a clase definida por el usuario exportada que contiene clase STL privada como miembro. Dll asigna memoria para este objeto. Exe llama Método de liberación de este objeto cuando desea eliminarlo.
Creo que el siguiente NO es seguro. La clase definida por el usuario se crea una instancia en exe y se pasa a través de la interfaz exe/dll. Esta clase contiene una clase privada de STL como miembro. exe y dll comparten encabezados/archivos de implementación de esta clase de usuario. Cuando esta clase se construye en proyectos separados, se usarán diferentes implementaciones de STL. Por ejemplo, se aplicará diferente implementación de string :: size() (de diferentes tiempos de ejecución) para el mismo objeto en la memoria.
Creo que lo siguiente es seguro. La clase definida por el usuario se crea una instancia en exe y se pasa a través de la interfaz exe/dll. Esta clase no depende de la biblioteca estándar, solo usa tipos primitivos de C++. exe y dll comparten encabezados/archivos de implementación de esta clase de usuario. También debemos controlar que new y delete correspondan al mismo montón. Por ejemplo, podemos sobrecargar new/delete para que usen :: GetProcessHeap.
Creo que lo siguiente NO es seguro: pasar objetos de impulso a través de la interfaz exe/dll porque pueden depender de las clases de biblioteca estándar. También eliminar puede no corresponder al nuevo montón.
Creo que lo siguiente NO es seguro: incluso si pasamos objetos boost a través de la interfaz exe/dll y no dependen de las clases de biblioteca estándar pero no se implementan solo como encabezado, entonces el objeto se puede crear con un impulso lib (para un tiempo de ejecución) y utilizado con otro boost lib (para otro tiempo de ejecución). También eliminar puede no corresponder al nuevo montón.
También quiero utilizar un poco de sabor de puntero inteligente para pasar referencia a objetos (mencionados en el punto 3) de EXE a partir de DLL y DLL a EXE. Creo que este puntero inteligente también debería sobrecargar new/delete para asignar el contador de referencia del montón de proceso predeterminado. Cuando se va a tratar de eliminar objeto puntiagudo se llamará a eliminar esa sobrecargada por este objeto (como en elemento3)
Para los objetos de la partida 1 Quiero usar puntero personalizado inteligente que método de liberación de objeto puntiagudo llamar (como se boost :: shared_ptr con versión personalizada)
¿Qué problemas no se mencionaron? Corrígeme por favor.