Free the defines memory earlier.

There is no need to keep this memory for the life of the program.
Warn on redefining.
Allow the preprocessor to abort.

If the preprocessor encounters a problem, such as failing to load a source
file or an improperly formatted define, it should be able to abort running
the program.