Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Liberar memoria.

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Liberar memoria. Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Re: Liberar memoria. Responder citando

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
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Si debe funcionar, ya que se está devolviendo una copia de la cadena que estás devolviendo para ser utilizada.

Saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias a todos sois de gran ayuda para los novatos como yo.

Un saludo. Roberto.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.