Avatar billede franzy Nybegynder
28. april 2006 - 20:39 Der er 10 kommentarer og
1 løsning

delete (uden variabel)

Nok en skummel titel men jeg vil jo alligevel forklare situationen :P

Jeg og min gruppe på uni er igang med at programere et spil i C++. Det går fint indtil videre. Undervejs opretter vi en masse objekter (class) på følgende måde:

new Rabbit(x,y,2000);

... altså uden at tilføre det til en variabel. Men på et eller andet tidspunkt så dør denne kanin og skal derfor fjernes igen. For at undgå at bruge "delete this", laver vi en "slettekø" (removeQueue) som bliver gennemgået engang imellem  (denne kø indeholdere pointere til de objekter der skal slettes). Når objekterne skal slettes bliver det gjort med "delete" på følgende måde:

object = removeQueue[i];
removeQueue[i] = NULL;
delete object;

både object og removeQueue er af typen "*Rabbit" (eller en af dens forældre).

Problemmet er så bare at den sidste del (den med delete) fungere ikke. Det giver hurtigt en ordenlig mængde objekter som bare ligger og fylder i hukomelsen.

Jeg kunne forestille mig grunden til dette skyldes at variablen "object" ikke indeholder en "new Rabbit" men derimod bare en "*Rabbit". Har nemlig ikke kunne finde nogen eksempler hvor en delete bruges på en class der IKKE bliver lagt over i en variabel.

Er dette tilfældet?
Gør jeg noget enormt forkert?
Nogen forslag til hvad jeg kunne gøre?
Avatar billede arne_v Ekspert
28. april 2006 - 20:44 #1
jeg kan ikke lide designet, men det burde faktisk virke

hvordan checker i deallokering ?

har I styr paa copy constructor og assigment operator ?
Avatar billede franzy Nybegynder
28. april 2006 - 20:48 #2
tvivler jeg stærkt på, er nemlig ikke sikker på hvad du mener :) . Det at vi bruger new og delete er noget af det dybeste vi er kommet i at lege med hukomelse i C++ indtil videre :/
Avatar billede bertelbrander Praktikant
28. april 2006 - 20:49 #3
Hvis I vil have den til at kalde jeres destructor, skal alle elementer i removeQueue arve fra samme base class der skal have en virtual destructor.

Hvis de har det, så burde det virke.
Avatar billede franzy Nybegynder
28. april 2006 - 20:52 #4
jeps, de er alle fra samme base class, og den har en:
virtual ~Father() {}

(ja base-classen hedder Father :P )

classen Rabbit har også selv en destructor:
~Rabbit();
(uden virtual ect.)
Avatar billede bertelbrander Praktikant
28. april 2006 - 20:56 #5
Hvordan ved I så at det ikke virker?
Er object af typen Father* ?
Avatar billede arne_v Ekspert
28. april 2006 - 20:57 #6
hvis i allokerer data i Rabbit constructor saa skal I med stor sandsynlighed
have en copy constructor og en assignment operator
Avatar billede franzy Nybegynder
28. april 2006 - 20:59 #7
hmm... wtf... nu ser det ud til at funge... hvordan ved jeg så ikke.
sku da typisk når jeg endelig spørger om hjælp udefra og så løser den sig selv :S

vores hovedløkke gennemløber alle objekter. Samtidig den tæller dem og skriver derefter antalet ud. Det tal er så endelig begyndt at stabilisere sig.

takker dog for jeres kommentare, og undskylder forstyrelsen :)

vi skal nok have leget noget mere med at få det hele til at se teknisk pænt ud, men det kommer.
Avatar billede nubi19 Nybegynder
10. maj 2006 - 08:46 #8
arne_v > hvorfor vil du have en copy constructor og assignment operator (går ud fra du her bare mener =, og ikke += osv.) ?

franzy > når du bruger new får du altid en pointer retur.
dvs. new Rabbit(x,y,2000) returnerer en *Rabbit og det er kun pointeren du gemmer i en evt. variabel. Men hvor og hvordan får i disse pointere over i jeres kø ? (Det kunne være her kæden hopper af)

Og hvilken type er køen oprettet som (f.eks. et array af father eller ?)
Avatar billede franzy Nybegynder
10. maj 2006 - 09:17 #9
Problemmet er løst (ved ikke hvordan jeg "lukker" dette spørgsmål.

Vi har et array af Father* som holder styr på alle oprettede objekter. Hvert objekt skal dog selv sørge for at tilføje sig selv til det hvilket jo er lidt risikabelt men indtil videre er det da lykkedes for os at holde styr på det :) .

Vores delete-kø er også et array af Father* hvor pointeren bliver smidt ind når den skal deletes.

Der er ingen i gruppen der har arbejdet så meget med C++ som vi gør nu, så det hele er rent læring :) ... og der vil komme en masse "fy"-metoder :D
Avatar billede nubi19 Nybegynder
10. maj 2006 - 17:25 #10
Det er altid godt at lære noget af tingene, så det er jo fint nok :)

Men du lukker spørgsmålet ved at nogen opretter et svar og du så giver den eller de person(er) point. Jeg skal ingen have, så de andre må slås om dem ;)
Avatar billede franzy Nybegynder
10. maj 2006 - 17:36 #11
det kunne være gjort smartere >_<
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester