Und weshalb kann ich den Speicher über
obj1.Free mehrfach freigeben, aber nicht über obj2.Free?
Nein.
FreeAndNil setzt auch due Variable auf NIL und Free/FreeAndNil machen nichts mehr wenn die Variable schon NIL ist.
Delphi-Quellcode:
obj := TTestKlasse.Create;
obj.Free;
obj.Free; // peng
obj := TTestKlasse.Create;
obj.Free;
obj := nil;
obj.Free; // nicht peng
obj := TTestKlasse.Create;
FreeAndNil(Obj);
obj.Free; // nicht peng
obj := TTestKlasse.Create;
FreeAndNil(Obj);
FreeAndNil(Obj); // nicht peng
Ob die Variable nun obj heißt oder ob es eine "Kopie" obj2 gibt, ist hierbei unerheblich ... es kommt immer auf das selbe Prinzip hinaus.
Delphi-Quellcode:
obj := TTestKlasse.Create;
obj2 := obj
obj.Free; // oder FreeAndNil(obj);
obj2 := nil;
obj2.Free; // nicht peng
Delphi-Quellcode:
obj := TTestKlasse(123456789);
obj.Free; // peng, weil der Zeiger nicht auf eine Objektinstanz zeigt