ich beschäftige mich gerade mit Polymorphismus unter Freepascal und habe mir dazu ein simples Beispielprogramm gebastelt. Das habe ich dann beim Freigeben der Objekte gerasht (SigSegV), da ich vorher die Objektreferenzen fröhlich getauscht habe. Das ist mir soweit klar. Was mir nicht klar ist: wie man diese Freigaben sauber programmiert.
Der Code sieht so aus (hier nur das entscheidende Fragment, der Rest sind Testausgaben von überschriebenen Funktionen):
Code: Alles auswählen
EinTier:= TAnimal.Create;
Fido := TDog.Create;
Miezi := TCat.Create;
{TDog und TCat sind von TAnimal abgeleitet}
EinTier := Fido;
EinTier := Miezi;
FreeAndNil(EinTier);
FreeAndNil(Fido);
FreeAndNil(Miezi); {Hier knallt es}
Ich bin mir sicher, dass es zum Absturz kommt, weil ich "Miezi" freigeben will, obwohl das schon durch "EinTier" erfolgt ist. Okay, da kann man auch sagen: pass halt besser auf (was schwierig sein kann, wenn es um mehr geht als so ein simples Demo-Ding). Man könnte natürlich auch solche Freigaben immer in ein Try packen. Oder gibt es eine Funktion, die erst schaut, ob der Speicher, auf den die Referenz verweist, schon freigegeben ist? Oder gibt es für sowas ein BestPractice oder ein Turnaround oder was auch immer? Wie macht ihr sowas?