As far as I'm aware, calling free() on a pointer that's already been released does not make the operating system complain... When it looks up the memory address in the memory map, and doesn't find it (since it has already been freed), then it just exits.
[EDIT]From the free man page: free() frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc() or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behaviour occurs. If ptr is NULL, no operation is performed.
Now, if by random chance, a new allocation received the exact same address (in another part of the application or a different app entirely), then you could have problems, but there may (or may not) be protections in place to prevent such a thing from happening.
[EDIT]This may be the undefined behavior the man page refers to (freeing a pointer that you technically don't own or weren't responsible for allocating)