Liberar Memoria

05/03/2004 - 00:25 por Willser F. González C. | Informe spam
Hola a todos,

Tengo el siguiente código:

1. char *pcCadena = NULL;
2. LlamarDLL(pcCadena);
3. Cuando se llama a [ LLamarDLL(...) ], dentro de esta función DLL se
reserva [ X ] cantidad de memoria para la variable [ pcCadena ];
4. Después de llamar a la función DLL grabo el contenido de [ pcCadena ] en
un archivo y el archivo queda bien.
5. Ahora necesito liberar la memoria reservada por [ FuncionDLL ] para [
pcCadena ].

Problema:

1. No puedo liberar la memoria ocupada (bastantica) por [ pcCadena ], ni con
(delete [ ] pcCadena), ni con (free(pcCadena)), pues me sale un error, tanto
en Debug como en Release.

2. En debug, sale este error:

File: dbgheap.c
Line: 1044
Expression: _CrtIsValidHeapPointer (pUserData)

3. Es necesario eliminar la memoria explícitamente?, será posible que esta
memoria sea liberada por la DLL cuando ésta se descargue?.

Les agradezco cualquier aporte o aclaración al respecto.

Entorno: Visual C++ 6.0 sobre Windows XP Prof.
Nota: La "aplicación" que llama a esta DLL es otra DLL de tipo ATL.

Preguntas similare

Leer las respuestas

#1 Rodrigo Corral González [MVP]
05/03/2004 - 09:14 | Informe spam
El problema es que no sabes como esta reservando memoria la dll (malloc,
new, CoTaskMemAlloc...), luego no sabes como tienes que liberar (free,
delete, CoTaskMemFree...).

El programador de la dll es quien debe documentar esto y proverte una
función para liberar o especificarte con cual debes liberar. No es seguro
que asumas que la dll liberará esa memoria.

Rodrigo Corral González [MVP]

microsoft.public.es.vc FAQ
http://vcfaq.europe.webmatrixhosting.net
Respuesta Responder a este mensaje
#2 Willser F. González C.
05/03/2004 - 15:13 | Informe spam
Ok Rodrigo, supongamos que la DLL hace la reserva con new, malloc u otra
función, es de suponer que esta reserva se puede liberar con su respectivo
delete, free o la función correspondiente? o podrían haber restricciones?.

Willser F.
Respuesta Responder a este mensaje
#3 Rodrigo Corral González [MVP]
05/03/2004 - 16:08 | Informe spam
No, si sabes con que función se reserva deberias poder liberara con la
función pareja.


Rodrigo Corral González [MVP]

microsoft.public.es.vc FAQ
http://vcfaq.europe.webmatrixhosting.net
Respuesta Responder a este mensaje
#4 CodeWarrior
06/03/2004 - 00:24 | Informe spam
Hola a todos,

Tengo el siguiente código:

1. char *pcCadena = NULL;
2. LlamarDLL(pcCadena);
3. Cuando se llama a [ LLamarDLL(...) ], dentro de esta


función DLL se
reserva [ X ] cantidad de memoria para la variable [


pcCadena ];
4. Después de llamar a la función DLL grabo el contenido


de [ pcCadena ] en
un archivo y el archivo queda bien.
5. Ahora necesito liberar la memoria reservada por [


FuncionDLL ] para [
pcCadena ].

Problema:

1. No puedo liberar la memoria ocupada (bastantica) por [


pcCadena ], ni con
(delete [ ] pcCadena), ni con (free(pcCadena)), pues me


sale un error, tanto
en Debug como en Release.

2. En debug, sale este error:

File: dbgheap.c
Line: 1044
Expression: _CrtIsValidHeapPointer (pUserData)

3. Es necesario eliminar la memoria explícitamente?, será


posible que esta
memoria sea liberada por la DLL cuando ésta se descargue?.

Les agradezco cualquier aporte o aclaración al respecto.

Entorno: Visual C++ 6.0 sobre Windows XP Prof.
Nota: La "aplicación" que llama a esta DLL es otra DLL de


tipo ATL.




RESPUESTA

Bueno, me gustaría conocer un poco más de lo que hace
LlamarDLL() y si es desde dentro de esa función desde la
cual guardas los datos en el fichero.

Pero así a primera vista, podría ser que lo que tienes que
pasar a LlamarDLL() no es un char *, sino un char **, ya
que si reservas memoria de forma dinámica dentro de
LlamarDLL(), tal vez deberías utilizar una doble
indirección pasando a la función LlamarDLL(&cadena) y
asignar la memoria dentro de la función a *cadena. De esa
forma deberías poder liberar la memoria reservada desde fuera.
El código más o menos podría ser:

sería LlamarDLL(char**)
Respuesta Responder a este mensaje
#5 Gabriel Gibaut
06/03/2004 - 02:37 | Informe spam
Como dijo Rodrigo en su mensaje, tienes que usar la funcion par de con la
que se asigno ( new/delete, etc.)

Tambien tienes que fijarte de que heap se obtiene la memoria ( por ejemplo,
la dll crea un heap aparte con HeapCreate?), asi como con que version del
crt estan enlazando y en que modo. Por ejemplo si tu enlazas tu aplicacion
con CRT dinamicamente y la dll lo tiene enlazado estaticamente, van a estar
referenciando dos heaps distintos.

Saludos

Gabriel


"Willser F. González C." escribió en el mensaje
news:#
Hola a todos,

Tengo el siguiente código:

1. char *pcCadena = NULL;
2. LlamarDLL(pcCadena);
3. Cuando se llama a [ LLamarDLL(...) ], dentro de esta función DLL se
reserva [ X ] cantidad de memoria para la variable [ pcCadena ];
4. Después de llamar a la función DLL grabo el contenido de [ pcCadena ]


en
un archivo y el archivo queda bien.
5. Ahora necesito liberar la memoria reservada por [ FuncionDLL ] para [
pcCadena ].

Problema:

1. No puedo liberar la memoria ocupada (bastantica) por [ pcCadena ], ni


con
(delete [ ] pcCadena), ni con (free(pcCadena)), pues me sale un error,


tanto
en Debug como en Release.

2. En debug, sale este error:

File: dbgheap.c
Line: 1044
Expression: _CrtIsValidHeapPointer (pUserData)

3. Es necesario eliminar la memoria explícitamente?, será posible que esta
memoria sea liberada por la DLL cuando ésta se descargue?.

Les agradezco cualquier aporte o aclaración al respecto.

Entorno: Visual C++ 6.0 sobre Windows XP Prof.
Nota: La "aplicación" que llama a esta DLL es otra DLL de tipo ATL.



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida