On Friday 28 September 2007 21:14:45 Ralf Friedl wrote:
> Tito wrote:
> > Maybe this version could be more useful.....
> >
> > void xfree(void *ptr)
> > {
> >     /*       sets the pointer to NULL
> >             after it has been freed.*/
> >     void **pp = (void **)ptr;
> >
> >     if (*pp == NULL) return;
> >
> >     free(*pp);
> >     *pp = NULL;
> > }
> >
> >   
> You only modify the argument of xfree, not the original pointer.
> 
> What you wanted to write is:
> 
> void xfree(void **pp)
> {
>       /*       sets the pointer to NULL after it has been freed.*/
>       if (*pp == NULL) return;
>       free(*pp);
>       *pp = NULL;
> }
> 
> 
> Regards
> Ralf Friedl
> 
Hi,
I'm sorry but i am not able to compile your code.
The only version that compiles seems not to work....
maybe i'm overlooking something very obvious.
OTOH i'm pretty sure my versions works as this code snippet shows:
compile with:
gcc -Wall test.c -o test
and run:
./test
test1
test 2
p is NULL

Ciao,
Tito

-----------------------------------------------------------------------------------------------------------------------------
#include <stdlib.h>
#include <stdio.h>

void xfree(void **pp)
{
        /*       sets the pointer to NULL after it has been freed.*/
        if (*pp == NULL) return;
        free(*pp);
        *pp = NULL;
}


void myxfree(void *ptr)
{
        /*       sets the pointer to NULL after it has been freed.*/
        void **pp = (void **)ptr;

        if (*pp == NULL) return;

        free(*pp);
        *pp = NULL;
}


int main(int argc, char **argv)
{
        /* Sets the pointer to NULL so no double-free fault */

        char *p;
        
#if 0
        char ** p2p;

        p = malloc(10);

        /* warning: passing argument 1 of ‘xfree’ from incompatible pointer 
type */
        xfree(&p);
        xfree(&p);

        p = malloc(10);
        /* warning: passing argument 1 of ‘xfree’ from incompatible pointer 
type */
        xfree(p);
        xfree(p);
        
        p = malloc(10);
        /* warning: passing argument 1 of ‘xfree’ from incompatible pointer 
type */
        p2p = &p;
        xfree(p2p);
        p2p = &p;
        xfree(p);
#endif
        
        puts("test 1");
        /* Compiles but fails on p == NULL test */
        p = malloc(10);
        xfree((void **)p);
        if (p == NULL) puts("p is NULL");
        xfree((void **)p);


        p = malloc(10);
        
        puts("test 2");
        myxfree(&p);
        if (p == NULL) puts("p is NULL");
        myxfree(&p);

        return 0;
}
---------------------------------------------------------------------------------------------------------
_______________________________________________
busybox mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/busybox

Reply via email to