"La gestión de la memoria" es una responsabilidad dividida, por lo general. El sistema operativo dirige el espacio en grandes fragmentos al tiempo de ejecución, que luego distribuye en bits más pequeños al programa. Este espacio de direcciones puede o no tener RAM asignada. (De lo contrario, habrá un espacio de intercambio para respaldarlo)
Básicamente, cuando se carga una DLL, Windows asigna espacio de direcciones para el código y los segmentos de datos, y llama al DllMain()
. El compilador de C++ habrá dispuesto llamar a ctors globales desde DllMain()
. Si se trata de una DLL escrita en C++, probablemente dependa de una DLL de tiempo de ejecución C++, que a su vez dependerá de Kernel32.DLL y User32.DLL. Windows entiende tales dependencias y hará los arreglos para que se carguen en el orden correcto.
Solo hay un espacio de direcciones para una prueba, por lo que una DLL tendrá acceso a toda la memoria del proceso. Si se carga una DLL en dos procesos, habrá dos copias lógicas del código y los datos. (las copias del código y los datos de solo lectura pueden compartir la misma memoria RAM física).
Si la DLL asigna memoria usando las funciones del sistema operativo, Windows asignará la memoria al proceso desde el cual la DLL hizo esa asignación. El proceso debe devolver la memoria, pero cualquier código en el proceso puede hacerlo. Si su DLL asigna memoria usando funciones de C++, lo hará llamando al operator new
en la DLL de tiempo de ejecución de C++. Esa memoria debe devolverse llamando al operator delete
en la (misma) DLL de tiempo de ejecución de C++. Nuevamente, no importa quién haga eso.
Las clases de STL como vector<>
se pueden crear múltiples instancias, pero no importa si se usa el mismo compilador. Todas las instancias serán sustancialmente iguales, y todas devolverán la memoria del vector a la misma función de desasignación.
Hay 2 supuestos principales en esta explicación:
- El EXE y sus DLL están compilados con el mismo compilador
- El EXE y sus DLL todo enlace contra la DLL de tiempo de ejecución C++ (es decir, no estáticamente vinculado)
La vinculación estática frente al tiempo de ejecución de C++ es útil si desea enviar un archivo EXE independiente y autónomo. Pero si ya está enviando archivos DLL, también debe mantener el tiempo de ejecución de C++ en su propia DLL.
Pregunta relacionada: http://stackoverflow.com/questions/2266218/ –
Otra pregunta relacionada: http://stackoverflow.com/questions/1634773/ –
La respuesta aceptada a esto tiene lo que necesita Creo: http : //stackoverflow.com/questions/2154939/ –