Función que reserva memoria

24/01/2005 - 17:59 por Willser F. González C. | Informe spam
Hola,

Tengo las siguientes líneas en una DLL:

bool FuncionX();

bool ReservarMemoria(unsigned char **i_ppucBuffer,
long i_lSize);

bool FuncionX()
{
unsigned char *l_pucBuffer = NULL;

if (ReservarMemoria(l_pucBuffer, 10000000))
{
printf ("OK");

LlamarAFuncionDeTercero(l_pucBuffer);

free(l_pucBuffer);

return (true);
}

printf ("NO OK");

return (false);
}

bool ReservarMemoria(unsigned char **i_ppucBuffer,
long i_lSize)
{
*i_ppucBuffer = NULL;

i_ppucBuffer = (unsigned char *) malloc(i_lSize);

if (i_ppucBuffer == NULL)
return (false);

return (true);
}

La idea es que la segunda función debe hacer la reserva de memoria. No
utilizo new debido a problemas de "compatibilidad" con unas DLLs de
terceros. La pregunta concreta es: es esta la forma como debo declarar el
primer parámetro y su respectiva reserva de memoria?.

Haciendo seguimiento de la funcion "FuncionX()" de la DLL desde un programa
VC++ esta se ejecuta sin problemas, pero si llamo a "FuncionX()" desde una
aplicación Visual Basic se presenta un error en la línea
"free(l_pucBuffer)", pero este error sólo se presenta la primera vez que
llamo a "FuncionX()", si la llamo nuevamente de manera consecutiva, el error
no se vuelve a presentar. También he notado que una vez termine la
ejecución de la aplicación VB y vuelvo a lanzarla, entonces ya no se
presenta el error en el primer llamado a "FuncionX()". La aplicación VB se
lanza simpre desde el Visual Basic, no desde su propio ejecutable. Alguien
puede sugerirme alguna causa?

Willser F.
willser@latinmail.com

Preguntas similare

Leer las respuestas

#1 Rodrigo Corral [MVP]
25/01/2005 - 20:20 | Informe spam
Yo a simple vista no veoy nada raro en el código!!!


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org
Respuesta Responder a este mensaje
#2 Willser F. González C.
25/01/2005 - 21:13 | Informe spam
He hecho pruebas cambiando la línea:

i_ppucBuffer = (unsigned char *) malloc(i_lSize);

por:

*i_ppucBuffer = (unsigned char *) malloc(i_lSize); // Anteponer el
Asterisco.

Y parece que se ha normalizado un poco el error, pero, por qué funciona bien
desde VC++ sin el asterisco?, y también con él?...

"Rodrigo Corral [MVP]" escribió en el mensaje
news:#
Yo a simple vista no veoy nada raro en el código!!!


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org


Respuesta Responder a este mensaje
#3 Willser F. González C.
25/01/2005 - 21:15 | Informe spam
Olvidé anotar que también cambié:

if (i_ppucBuffer == NULL)

por

if (*i_ppucBuffer == NULL) // Anteponer el Asterisco.


"Rodrigo Corral [MVP]" escribió en el mensaje
news:#
Yo a simple vista no veoy nada raro en el código!!!


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org


Respuesta Responder a este mensaje
#4 Hernán
26/01/2005 - 04:02 | Informe spam
"Willser F. González C." escribía:

A mí también me extraña muchísimo que compile...

[...]
if (ReservarMemoria(l_pucBuffer, 10000000))



if (ReservarMemoria(&l_pucBuffer, 10000000))

[...]
*i_ppucBuffer = (unsigned char *) malloc(i_lSize);


*i_ppucBuffer = malloc(i_lSize);

al menos si estás compilando en C.
[...]

De warnings como andamos. Creo que es una buena práctica mantenerlos
al máximo.

Hernán
Respuesta Responder a este mensaje
#5 Rodrigo Corral [MVP]
26/01/2005 - 10:26 | Informe spam
Tal y como indica Hernán la versión correcta del código es similar al que
aparece en este pequeño programa de prueba.

#include <windows.h>
bool ReservarMemoria(unsigned char **i_ppucBuffer, long i_lSize)
{
*i_ppucBuffer = (unsigned char *) malloc(i_lSize);
return !i_ppucBuffer == NULL;
}
bool FuncionX()
{
unsigned char *l_pucBuffer = NULL;
if (ReservarMemoria(&l_pucBuffer, 10000000))
{
printf ("OK");
//LlamarAFuncionDeTercero(l_pucBuffer);
ZeroMemory(l_pucBuffer, 10000000);
free(l_pucBuffer);
return true;
}
printf ("NO OK");
return false;
}

int _tmain(int argc, _TCHAR* argv[])
{
return FuncionX();
}

Utilizo el ZeroMemory para simular la función de terceros que utiliza la
memoria. Tu código anterior no podia compilar. Anoche estaba muy dormido sin
duda!!!

Un saludo
Rodrigo Corral González [MVP]
FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida