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

#6 Willser F. González C.
27/01/2005 - 15:11 | Informe spam
Disculpas, efectivamente, me faltó colocar el "&" en el mensaje, pero en el
código si estaba. (No fue un Copy-Paste).

Por ahora, los errores no aparecen en VB, pero lo extraño fue que tuve que
llamar a FuncionDeTercero(...) desde otra función de otra DLL VC++ y no
desde VB directamente y de esa manera no se presenta lo inicialmente
comentado.

El tipo de proyecto en VB es "Control ActiveX".

Mil Gracias.

"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
#7 Isidro Muñoz
02/02/2005 - 15:00 | Informe spam
Hola wilser,

Funciona bien sin el * porque el valor que estas modificando es el puntero
en la pila, digamos que no casca, pero te cascaría en el free.

Vayamos por parte.
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);
}

i_ppucBuffer es un puntero cuyo valor está almacenado en la pila, donde
están todos los parametros.
Si haces i_ppucBuffer = (unsigned char *) malloc(i_lSize)
estas reservando memoria y el puntero de memoria se lo estás asignando al
i_ppucBuffer, eso no casca, igual que si haces esto

unsigned i;
i = (int)malloc(i_lSize);

i se crea en la pila, y su valor lo haces igual al malloc devuelto.
Un puntero en realidad es un unsigned.

El problema te va venir en el free que se hace luego.
¿ porque ?,

porque no estás devolviendo el valor del puntero simplemente no estas
devolviendo nada.

unsigned char *l_pucBuffer = NULL;
if (ReservarMemoria(&l_pucBuffer, 10000000))

En la pila estas almacenando el puntero donde está creado l_pucBuffer.
cuando haces
i_ppucBuffer = (unsigned char *) malloc(i_lSize);
Estás modificando el valor de la pila enviado como parametros, eso quiere
decir que al volver la pila se destruira y l_pucBuffer va a seguir valiendo
lo mismo.

cuando haces:
*i_ppucBuffer = (unsigned char *) malloc(i_lSize);

El compilador está almacenando el valor no en la pila donde está creado
i_ppucBuffer, sino en la dirección de memoria que apunta i_ppucBuffer, de
esa forma al volver tendras en l_pucBuffer el valor devuelto por malloc.

Si lo haces sin *, cuando vuelve l_pucBuffer seguira valiendo lo mismo y al
hacer el free cascará porque no es el valor devuelto por malloc.

Espero haberme explicado.
Saludos.
Isidro.


"Willser F. González C." escribió en el mensaje
news:
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
#8 Willser F. González C.
03/02/2005 - 20:55 | Informe spam
Gracias Isidro,

Realmente me ha aclarado la duda al respecto.

Willser F.

"Isidro Muñoz" <imunoz@()daipro.net> escribió en el mensaje
news:uKjVC%
Hola wilser,

Funciona bien sin el * porque el valor que estas modificando es el puntero
en la pila, digamos que no casca, pero te cascaría en el free.

Vayamos por parte.
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);
}

i_ppucBuffer es un puntero cuyo valor está almacenado en la pila, donde
están todos los parametros.
Si haces i_ppucBuffer = (unsigned char *) malloc(i_lSize)
estas reservando memoria y el puntero de memoria se lo estás asignando al
i_ppucBuffer, eso no casca, igual que si haces esto

unsigned i;
i = (int)malloc(i_lSize);

i se crea en la pila, y su valor lo haces igual al malloc devuelto.
Un puntero en realidad es un unsigned.

El problema te va venir en el free que se hace luego.
¿ porque ?,

porque no estás devolviendo el valor del puntero simplemente no estas
devolviendo nada.

unsigned char *l_pucBuffer = NULL;
if (ReservarMemoria(&l_pucBuffer, 10000000))

En la pila estas almacenando el puntero donde está creado l_pucBuffer.
cuando haces
i_ppucBuffer = (unsigned char *) malloc(i_lSize);
Estás modificando el valor de la pila enviado como parametros, eso quiere
decir que al volver la pila se destruira y l_pucBuffer va a seguir
valiendo
lo mismo.

cuando haces:
*i_ppucBuffer = (unsigned char *) malloc(i_lSize);

El compilador está almacenando el valor no en la pila donde está creado
i_ppucBuffer, sino en la dirección de memoria que apunta i_ppucBuffer, de
esa forma al volver tendras en l_pucBuffer el valor devuelto por malloc.

Si lo haces sin *, cuando vuelve l_pucBuffer seguira valiendo lo mismo y
al
hacer el free cascará porque no es el valor devuelto por malloc.

Espero haberme explicado.
Saludos.
Isidro.


"Willser F. González C." escribió en el mensaje
news:
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
>
>






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