| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
bobbylanuit Ens

Registrado: 06 Jul 2005Mensajes: 31
|
Publicado: Lun 10 Mar, 2008 3:44 pm Asunto: Liberar memoria. |
|
|
Hola a todos.
Tengo la siguiente función que forma parte de una dll.
| Código: | char* __stdcall Fichero2Cadena(const char* rutaFichero){
int iFileHandle;
int iFileLength;
char *buffer;
try{
iFileHandle = FileOpen(rutaFichero, fmOpenRead);
iFileLength = FileSeek(iFileHandle,0,2);
FileSeek(iFileHandle,0,0);
buffer = (char*)malloc((iFileLength+1)*sizeof(char));
//pszBuffer = newchar[iFileLength+1];
FileRead(iFileHandle, buffer, iFileLength);
FileClose(iFileHandle);
return (char*)buffer;
}
catch(Exception &e){
return (char*)e.Message.c_str();
}
} |
En esta función reservo memoria para la variable char* buffer. Mi pregunta es la siguiente, ¿Cómo libero la memoria asignada a buffer, si esta variable es el retorno de la función?. Si libero la memoria antes de realizar el retorno entonces no me devuelve nada. ¿Acaso la memoria se libera automáticamente al salir de la función?
Un saludo. Roberto. |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 10 Mar, 2008 6:31 pm Asunto: |
|
|
Efectivamente la funcion despues de Retornar el valor ha llegado a su fin destruyendo todas las variables locales que en ella se han declarado.
Saludos _________________
 |
|
| Volver arriba |
|
 |
edwinhp2 Lt JG

Registrado: 19 Nov 2005Mensajes: 67
|
Publicado: Lun 10 Mar, 2008 7:24 pm Asunto: |
|
|
Al terminar la función, solamente va a liberar los 4 bytes asignados para el apuntador al char, es decir, la variable buffer, pero la memoria asignada NO será liberada; para liberarla, donde utilices tu función tienes la obligación de hacerlo.
No te recomiendo hacerlo de esta forma, es mejor que le envies como parámetro el apuntador de char como parámetro de la función e internamente realices todo para que por fuera te obligues a hacer la liberación de memoria.
Saludos |
|
| Volver arriba |
|
 |
bobbylanuit Ens

Registrado: 06 Jul 2005Mensajes: 31
|
Publicado: Lun 10 Mar, 2008 8:35 pm Asunto: |
|
|
Hola edwinhp2.
Creo entender que sería mejor declarar la función de esta manera
| Código: | char* __stdcall Fichero2Cadena(const char* rutaFichero, char* buffer) |
¿me equivoco?
Un saludo. Roberto. |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 10 Mar, 2008 11:19 pm Asunto: Re: Liberar memoria. |
|
|
| bobbylanuit escribió: |
Tengo la siguiente función que forma parte de una dll.
|
Disculpa no vi la primera linea o no estaba, pero si esta dentro de una DLL, NUNCA se va a liberar pues todas la DLL se cargan en memoria en todo caso debes generar un tipo de Datos que apunte a la funcion.
y dependiendo como cargues la función esta debes liberarla pero desde el punto donde la has cargado. liberas el uso de la función, mas no liberas a la memoria de la funcion pues dependiendo la llamada a la función esta sigue en la DLL
una forma de hacerlo seri al siguiente manera.
| Código: | HINSTANCE tuLibreria = LoadLibrary("TuArchivoDLL.dll");
char * __stdcall (*ptrTuFuncion)(const char *);
ptrTuFuncion = (char * __stdcall (*)(const char *))GetProcAddress(tuLibreria,"Fichero2Cadena");
ptrTuFuncion();// usamos la funcion
FreeLibrary(tuLibreria);// liberamos la descargamos la Dll |
Esta es una manera de usar tu funcion cargada en una libreria de manera dinamica, sin adjuntar archivos h o libs a tu proyecto.
ahora depende de la manera de como has echo tu libreria,
Saludos _________________
 |
|
| Volver arriba |
|
 |
bobbylanuit Ens

Registrado: 06 Jul 2005Mensajes: 31
|
Publicado: Mar 11 Mar, 2008 3:12 pm Asunto: |
|
|
Muchas gracias por la respuesta, pero tengo un pequeño problema....
La dll la utiliza una herramienta de bases de datos "Velneo" antiguamente "Visual Velázquez" que sólo es capaz de interpretar la salida de una dll, pero no puede "programar" con ella con lo que no puedo liberar la memoria una vez que he utilizado la función.
Se me ha ocurrido lo siguiente. Si declaro un AnsiString strTemp
| Código: | char* __stdcall Fichero2Cadena(const char* rutaFichero){
int iFileHandle;
int iFileLength;
char *buffer;
AnsiString strTemp;
try{
iFileHandle = FileOpen(rutaFichero, fmOpenRead);
iFileLength = FileSeek(iFileHandle,0,2);
FileSeek(iFileHandle,0,0);
buffer = (char*)malloc((iFileLength+1)*sizeof(char));
//pszBuffer = newchar[iFileLength+1];
FileRead(iFileHandle, buffer, iFileLength);
FileClose(iFileHandle);
// *************************************************************
// Asignamos a un AnsiString el buffer para así poder liberarlo.
// *************************************************************
strTemp = buffer;
free(buffer);
return (char*)strTemp.c_str();
}
catch(Exception &e){
free(buffer);
return (char*)e.Message.c_str();
}
} |
Sé que es una chapucilla, pero ¿funcionaría?
Un saludo y muchas gracias anticipadas. |
|
| Volver arriba |
|
 |
edwinhp2 Lt JG

Registrado: 19 Nov 2005Mensajes: 67
|
Publicado: Mar 11 Mar, 2008 5:44 pm Asunto: |
|
|
Si debe funcionar, ya que se está devolviendo una copia de la cadena que estás devolviendo para ser utilizada.
Saludos |
|
| Volver arriba |
|
 |
bobbylanuit Ens

Registrado: 06 Jul 2005Mensajes: 31
|
Publicado: Mar 11 Mar, 2008 7:17 pm Asunto: |
|
|
Muchas gracias a todos sois de gran ayuda para los novatos como yo.
Un saludo. Roberto. |
|
| Volver arriba |
|
 |
|