Entiendo que las asignaciones de memoria realizadas en un dll y luego en otro libre pueden causar todo tipo de problemas, especialmente con respecto al CRT. Este tipo de problemas son especialmente problemáticos cuando se trata de exportar contenedores STL. Hemos experimentado este tipo de problemas antes (cuando se escribe a medida Adobe plugins que enlazaban con nuestras bibliotecas) y hemos trabajado alrededor de estas cuestiones mediante la definición de nuestra propia asignador que utilizamos en todos nuestros envases, por ejemplo:Asignación y desasignación de memoria a través de los límites de dll
typedef std::vector < SessionFields,
OurAllocator <SessionFields> >
VectorSessionFields;
typedef std::set < SessionFields,
std::less <SessionFields>,
OurAllocator <SessionFields> >
SetSessionFields;
Esto ha funcionado bien al pasar tipos a/desde nuestro código, sin embargo, hemos encontrado un problema porque ahora tenemos que llamar a una función en el SDK de Adobe que devuelve un vector poblado que causa un bloqueo cuando sale del alcance .
Obviamente, es un problema con la memoria asignada en el SDK de Adobe que pertenece a un montón diferente cuando finalmente está libre en mi código. Así que estoy pensando que tal vez podría hacer algo inteligente como reemplazar o exportar el asignador utilizado en su SDK para poder usarlo para limpiar los contenedores devueltos de sus funciones.
También estoy buscando en la escritura de un contenedor o algún tipo de capa de procesador mediante el cual los contenedores STL se proceda a seguridad entre el código y el SDK (aunque esto suena muy desordenado).
Alternativamente, también estoy buscando usando GetProcessHeaps
para identificar el montón usado dentro del SDK, y trato de liberarlo contra este montón, en lugar del montón predeterminado.
¿Alguien tiene algún consejo sobre cómo podemos resolver este problema?
Esta es una técnica muy común, también la he visto en C donde una biblioteca requiere que sus usuarios proporcionen una devolución de llamada de asignación/desasignación a través de algún tipo de punto de biblioteca init(). – Justin