Har problemer med at fjerne objekter og ryde hukommelsen?
Hej Eksperter
Jeg er i gang med et spil, men jeg er stødt ind i et problem. Jeg skulle helst gerne rydde op i hukommelsen og slette nogle objekter, men jeg ved ikke helt hvordan man gør og hvordan det hænger sammen. indtil videre har jeg fundet ud af det er noget med en pointer man skal have på et objekt. Men er der nogen der kan forklare mig helt præcist hvordan det hænger sammen? :)
Et Object i Delphi er lig en pointer. Man opretter/alloker hukommelse med funktionen Create(); og fjerner/sletter med funktionen Free; det er to funktioner som ligger på TObject klassen.
Jeg gentager mig selv. Brug en TObjectList til at indeholde objekterne. Når du frigiver objektlisten frigiver du også det der er i listen - og så er den bedre end en ARRAY OF konstruktion. Det irriterer mig at den vælges når der er en anden der er meget bedre.
Hvis du kreerer en TImage med en owner, eksempelvis TImage.Create(self), er det self's ansvar at rydde op (TImage hægter sig på en liste over objekter som self skal frigive). Det er derfor du kun behøver frigive en form og ikke alle de komponenter der er på den.
Bemærk, at self er (pointeren til) den objektinstans hvori objektet oprettes.
GaverCount er så bare en integer der bliver countet hele tiden, for at finde den rette plads i arrayet.
Men jeg ved så ikke hvordan jeg skal få dem slettet igen, jeg har prøvet følgende, når man har fanget de gaver i spillet, som man skal kører jeg følgende kode:
while i < Length(objGaver) do begin objGaver[i].Free; end; SetLength(objGaver, 0);
Det eneste sted hvor sådan en array of <et eller andet> er på sin plads er ved COM-objekter og som "gummi"-parameter i procedure-kald. Alle andre steder er det på sin plads at bruge TObjectList (Det er også lettere).
I øvrigt burde du ikke skrive objGaver[GaverCount] så mange gange. Tænk på at programmet laver opslag i listen hver gang. Det er ineffektivt.
Den rigtige måde er denne: var Image: TImage; NewLgd: integer; begin Image := TImage.Create(nil); // Ikke self når du frigiver listen selv Image.Parent := self; // Form2 er garanteret self, ikke? Image.AutoSize := true; Image.Left := RandomRange(10, 520); Image.Top := 220; Image.Picture.LoadFromFile(gfx/' + FarveGave(RandomRange(0,5)));
------ Forkert ------------------ while i < Length(objGaver) do begin objGaver[i].Free;
end; SetLength(objGaver, 0);
------------------ Du skal kører i en løkke som jeg skrev. denne koder Free'er bare det samme obj. nemli [i], fordi I ikke bliver talt ned, og dit array bliver ikke autonatisk en mindre fordi du free'er.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.