Man muß beim Anwenden von Free gar nicht nachfragen ob die Variable zugewiesen ist oder nicht. Folgendes führt zu keinem Fehler:
Delphi-Quellcode:
sl := TStringList.Create;
sl.Free; // gibt die StringList frei. sl ist hinterher NICHT nil, sondern zeigt ins leere
sl.Free; // funktioniert trotzdem!
Das liegt daran, dass Free eine Klassenfunktion ist. Bei Dir tritt ein Fehler auf, weil Du
buchung.kunde.Free;
aufrufst - das funktioniert nur wenn buchung nicht ins Leere zeigt und nicht nil ist. (Der Fehler ist also nicht das Free, sondern das buchung.kunde - buchung zeigt ins nirvana und kunde ist dort nicht zu finden)
Immer beachten:
Ein Zeiger / eine Klasse die man noch braucht sollte man nach dem Aufruf von Free immer auf nil setzen, damit man an anderer Stelle weiß ob sie auf einen Wert zeigt oder nicht. Das kann man entweder mit zwei Befehlen machen (sl.Free; sl := nil;) oder mit FreeAndNil(sl).
Frage: Warum programmierst Du nicht objektorientiert und gibst den Kunden im Destruktor der Buchung automatisch frei? Dann reiche Buchung.Free; und den ganzen anderen Kram kannst Du dir schenken.