Hmm, man muss nur mal darauf achten welche Variable man freigibt.

Hier mal ein kleines Beispiel, bei dem valgrind --leak-check=full nichts zu beanstanden hat.

Code:
#include <stdlib.h>

int main()
{
        char **foo1 = NULL;
        char **foo2 = NULL;
        char **foo3 = NULL;
        char **foo4 = NULL;

        char **bar = realloc(foo1, 10 * sizeof(char *));
        free(bar);

        char **baz = (char **) realloc(foo2, 10 * sizeof(char *));
        free(baz);

        foo3 = (char **) realloc(foo3, 10 * sizeof(char *));
        free(foo3);

        foo4 = realloc(foo4, 10 * sizeof(char *));
        free(foo4);

        return 0;
}