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

Registrado: 06 Jul 2005Mensajes: 31
|
Publicado: Dom 02 Oct, 2011 11:08 am Asunto: Liberar memoria puntero en dll. |
|
|
Hola a todos.
Sé que es un tema recurrente, pero buscando en el foro no he podido encontrar la resupuesta sobre la duda que tengo.
El tema es que estoy haciendo una dll que lea una línea de de un archivo de texto.
| Código: |
#define DLL_EXPORT __declspec(dllexport)
char* DLL_EXPORT readLine(fchar* fichero, int maxSize){
char* line = malloc(maxSize);
FILE *fichero;
fichero = fopen(fichero, "rt");
fgets(line, maxSize, fichero);
fclose(fichero);
return (char*)line;
} |
Si libero la memoria del puntero al array antes de devolver el valor, evidentemente no devuelvo nada ¿Qué sucede si no la libero?
Una solución sería incorporar el valor de retorno dentro de la definición de la función
| Código: | #define DLL_EXPORT __declspec(dllexport)
char* DLL_EXPORT readLine(fchar* fichero, int maxSize, char* line){
FILE *fichero;
fichero = fopen(fichero, "rt");
fgets(line, maxSize, fichero);
fclose(fichero);
return (char*)line;
} |
Pero por exigencias, no puedo retornar valores en los parámetros de entrada de la dll.
¿Cómo resuelvo el problema?
Muchas gracias de antemano. |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Lun 03 Oct, 2011 9:55 pm Asunto: |
|
|
Si no es obligatorio C puro puedes devolver:
1.- Un C++ Stream
2.- Un Builder C++ String
Si es obligatorio C puro no liberes el buffer, pero tendrá que liberarlo la función que llama a la dll tras usarlo.
Saludos. |
|
| Volver arriba |
|
 |
bobbylanuit Ens

Registrado: 06 Jul 2005Mensajes: 31
|
Publicado: Mar 04 Oct, 2011 8:29 am Asunto: |
|
|
Hola escafandra, primero muchas gracias por contestar.
| Cita: | | Si es obligatorio C puro no liberes el buffer, pero tendrá que liberarlo la función que llama a la dll tras usarlo. |
Te refieres a algo así como
¿Serviría de algo declarar la variable line como global y liberarla antes de utilizarla?
| Código: | #define DLL_EXPORT __declspec(dllexport)
static char* line;
char* DLL_EXPORT readLine(fchar* fichero, int maxSize){
free(line);
line = NULL;
line = malloc(maxSize);
FILE *fichero;
fichero = fopen(fichero, "rt");
fgets(line, maxSize, fichero);
fclose(fichero);
return (char*)line;
} |
Muchas gracias de antemano. Roberto. |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mar 04 Oct, 2011 5:14 pm Asunto: |
|
|
Si, me refiero a
| bobbylanuit escribió: |
¿Serviría de algo declarar la variable line como global y liberarla antes de utilizarla?
|
No es una buena práctica pues te quedará memoria sin libarar tras la primera ejecución, Liberas y luego creas...
Lo suyo sería:
| Código: | char* line = readLine(fichero, maxSize);
.....
free(line);
|
Saludos. |
|
| Volver arriba |
|
 |
bobbylanuit Ens

Registrado: 06 Jul 2005Mensajes: 31
|
Publicado: Mar 04 Oct, 2011 5:19 pm Asunto: |
|
|
Muchas gracias escafandra
Me has resuelto las dudas que tenía.
Un saludo. Roberto. |
|
| Volver arriba |
|
 |
|