FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour ayuda con uso de hb_xfree
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM

ayuda con uso de hb_xfree

Posted: Sun Apr 28, 2024 02:55 AM
Dado este c贸digo
Code (fw): Select all Collapse
聽 聽 case SQL_CHAR: {
聽 聽 聽 char *szResult = (char *) hb_xgrab(lLen + 1); //crea var string zero de un tama帽o lLen
聽 聽 聽 hb_xmemset(szResult, ' ', lLen); //rellena de espacios
聽 聽 聽 szResult[lLen] = '\0'; //define fin de cadena
聽 聽 聽 hb_itemPutCLPtr(pItem, szResult, lLen); //pone en puntero pItem la cadena creada, y algo mas???
聽 聽 聽 hb_xfree(szResult);//kdsoft - no se si se debe liberar la memoria ocupada por szResult o si lo hizo hb_itemPutCLPtr
聽 聽 聽 break;
Es necesario liberar la memoria con hb_xfree>
el codigo original no tiene esa linea de codigo, yo se la he puesto, pero tego duda, que hace realmente hb_itemPutCLPtr, entiendo que pone un valor en un puntero pItem, CLPtr, no se que significa (sera que tambien Clear the memory), hay una cuantas funciones con nombres similares, pero no tenog claro que hacen.

por ejemplo hay dos funciones similares hb_xmemset (esta es de harbour) y memset (esta es de c propiamente), seria interesante ir comprendiendo que haces estas funciones, aprender un poco el api moustroso de harbour. :-)

gracias
Code (fw): Select all Collapse
extern HB_EXPORT PHB_ITEM 聽 聽 hb_itemPutCLPtr 聽( PHB_ITEM pItem, char * szText, HB_SIZE nLen );
! hb_itemPutCPtr(), hb_itemPutCLPtr() fixed to put empty
string to item if szText is NULL and length is non-zero,
instead of trying to free NULL pointer causing internal
error.
* contrib/examples/rdddbt/dbfdbt1.c
* I did a mistake in 1999 by giving the name hb_itemPutCPtr()
to the function which would have to be correctly named
hb_itemPutCLPtr() (notice the 'L' for 'length').
se deduce, que hace hb_itemPutC -> pone un char string en item, L for Length y Ptr por pointer. (a la intentona) :-)
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM

Re: ayuda con uso de hb_xfree

Posted: Sun Apr 28, 2024 03:08 AM
viendo el c贸digo de dicha funci贸n, parece que si libera la memoria, por lo que parece que no es necesario liberarla por nuestra parte.
ummm, no s茅 si esto 煤ltimo sea correcto, alguien que sepa que aclare por favor.
Code (fw): Select all Collapse
PHB_ITEM hb_itemPutCLPtr( PHB_ITEM pItem, char * szText, HB_SIZE nLen )
{
聽 聽HB_TRACE( HB_TR_DEBUG, ( "hb_itemPutCLPtr(%p, %.*s, %" HB_PFS "u)", ( void * ) pItem, ( int ) nLen, szText, nLen ) );

聽 聽if( pItem )
聽 聽{
聽 聽 聽 if( HB_IS_COMPLEX( pItem ) )
聽 聽 聽 聽 聽hb_itemClear( pItem );
聽 聽}
聽 聽else
聽 聽 聽 pItem = hb_itemNew( NULL );

聽 聽pItem->type = HB_IT_STRING;
聽 聽pItem->item.asString.length = nLen;
聽 聽if( nLen <= 1 )
聽 聽{
聽 聽 聽 pItem->item.asString.allocated = 0;
聽 聽 聽 pItem->item.asString.value = ( char * ) HB_UNCONST( hb_szAscii[ nLen ? ( unsigned char ) szText[ 0 ] : 0 ] );
聽 聽 聽 hb_xfree( szText );
聽 聽}
聽 聽else
聽 聽{
聽 聽 聽 szText[ nLen ] = '\0';
聽 聽 聽 pItem->item.asString.allocated = nLen + 1;
聽 聽 聽 pItem->item.asString.value = szText;
聽 聽}

聽 聽return pItem;
}
tengo curiosidad que hace este bloque de codigo,como se interpreta. por que libera si nLen es menor o igual a 1??
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM

Re: ayuda con uso de hb_xfree

Posted: Sun Apr 28, 2024 03:16 AM

seria bueno una rama en el foro para las api de harbour. para clarar que hacen muchas de ellas.

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM

Re: ayuda con uso de hb_xfree

Posted: Sun Apr 28, 2024 04:44 AM

Carlos,

> hb_itemPutCLPtr(pItem, szResult, lLen);

Ese pItem que usas es NULL 贸 fu茅 creado con hb_itemNew( NULL ); ?

Si es NULL, entonces se crea uno nuevo que tienes que liberar. Si pItem no es NULL, el que tendr谩s que liberar es pItem.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM

Re: ayuda con uso de hb_xfree

Posted: Sun Apr 28, 2024 04:38 PM

Antonio, no es tanto el c贸digo, mi duda es m谩s de como es la forma correcta de usar la liberaci贸n de memoria,...

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM

Re: ayuda con uso de hb_xfree

Posted: Mon Apr 29, 2024 06:41 AM
Carlos,

No hab铆a entendido bien tu pregunta.

Mira lo que responde Llama3-70B: https://huggingface.co/chat/assistant/66238e78096b24c9dad9457c
Este bloque de c贸digo es una funci贸n en C que se encarga de asignar un valor de cadena a un objeto PHB_ITEM. A continuaci贸n, te explicar茅 paso a paso lo que hace esta funci贸n:

Par谩metros

pItem: Un puntero a un objeto PHB_ITEM que se va a modificar.
szText: Un puntero a una cadena de caracteres que se va a asignar al objeto pItem.
nLen: La longitud de la cadena szText.
Funcionamiento

La funci贸n comienza con una llamada a HB_TRACE, que probablemente es una funci贸n de depuraci贸n que imprime informaci贸n de seguimiento en la consola.
Se verifica si pItem es nulo. Si es as铆, se crea un nuevo objeto PHB_ITEM utilizando hb_itemNew(NULL).
Si pItem ya existe y es un objeto complejo (verificado con HB_IS_COMPLEX(pItem)), se llama a hb_itemClear(pItem) para limpiar el objeto.
Se establece el tipo de objeto pItem como una cadena (HB_IT_STRING).
Se establece la longitud de la cadena en pItem->item.asString.length con el valor de nLen.
Ahora, se verifica si la longitud de la cadena es menor o igual a 1 (nLen <= 1). Si es as铆:
Se establece pItem->item.asString.allocated en 0, lo que indica que no se ha asignado memoria adicional para la cadena.
Se asigna un valor especial a pItem->item.asString.value utilizando HB_UNCONST(hb_szAscii[nLen? (unsigned char) szText[0] : 0]). Esto parece ser un arreglo de cadenas ASCII predefinidas, y se selecciona la cadena correspondiente seg煤n el valor de nLen y el primer car谩cter de szText. Por ejemplo, si nLen es 0, se asigna una cadena vac铆a (hb_szAscii[0]). Si nLen es 1, se asigna la cadena que contiene solo el car谩cter szText[0].
Se llama a hb_xfree(szText) para liberar la memoria asignada para szText.
Si la longitud de la cadena es mayor que 1 (nLen > 1), se hace lo siguiente:
Se agrega un car谩cter nulo ('\0') al final de la cadena szText para indicar su fin.
Se establece pItem->item.asString.allocated en nLen + 1, lo que indica que se ha asignado memoria adicional para la cadena.
Se asigna la cadena szText directamente a pItem->item.asString.value.
Finalmente, se devuelve el objeto pItem modificado.
Por qu茅 libera si nLen es menor o igual a 1

La raz贸n por la que se libera la memoria asignada para szText cuando nLen es menor o igual a 1 es que, en ese caso, se utiliza una cadena ASCII predefinida en lugar de la cadena original. Al asignar una cadena predefinida, no se necesita la memoria original asignada para szText, por lo que se libera para evitar fugas de memoria.

En resumen, esta funci贸n asigna una cadena a un objeto PHB_ITEM y maneja los casos especiales cuando la longitud de la cadena es menor o igual a 1.
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM

Re: ayuda con uso de hb_xfree

Posted: Mon Apr 29, 2024 10:27 PM

Incre铆ble..., gracias Antonio...

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)

Continue the discussion