SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: diego.martinez en Viernes 23 de Mayo de 2008, 14:36

Título: Liberar Memoria Localizada En Una Dll
Publicado por: diego.martinez en Viernes 23 de Mayo de 2008, 14:36
Buenas:

Esta es la pregunta, si localizo memoria en una funcion de un procedimiento de una dll, y le paso el puntero a la aplicacion que esta usando esa instancia de dll, por que no puedo liberarla desde el programa anfitrion? es problema de los contextos?


gracias
Título: Re: Liberar Memoria Localizada En Una Dll
Publicado por: Eternal Idol en Viernes 23 de Mayo de 2008, 14:50
El problema es que el HEAP usado es diferente. Cada libreria CRT (C Run Time) suele llamar a HeapCreate al iniciarse y su malloc usa ese HEAP devuelto. Para comprobarlo podes hacer una prueba como esta:

En tu DLL, reservar con HeapAlloc y para el HEAP usas GetProcessHeap asi no usas un HEAP privado sino el del proceso por defecto. Ej.

Código: Text
  1.  
  2. char *mem = (char*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY /*no hace falta usar ZeroMemory a mano*/, size);
  3.  
  4.  

En tu programa, liberas con HeapFree y obviamente el mismo HEAP anterior. Ej.

Código: Text
  1.  
  2. HeapFree(GetProcessHeap(), 0, mem);
  3.  
  4.  
Título: Re: Liberar Memoria Localizada En Una Dll
Publicado por: diego.martinez en Viernes 23 de Mayo de 2008, 15:13
muchas gracias, era eso. Ya he podido arreglarlo.

anotado y aprendido.
Título: Re: Liberar Memoria Localizada En Una Dll
Publicado por: Eternal Idol en Viernes 23 de Mayo de 2008, 15:19
De nadas, lo mejor igual es seguir usando malloc/free o new/delete y que solo la DLL se encargue de su memoria.