Avatar billede tax Nybegynder
12. januar 2002 - 20:09 Der er 6 kommentarer og
1 løsning

Destruktion af klasser

Jeg har lavet et sæt klasser, hvor en moderklasse er nedarvet i ~4 børneklasser. Hver af disse børneklasser tilgår jeg igennem en pointer af modertypen.

Problemet er blot at jeg ikke kan køre delete på denne pointer, når jeg vil have ryddet op og lukket ned. Jeg får en ordentlig omgang dumped objects.

Skal jeg huske typen i klassen og delete efter den eller er der en lettere måde?

Jeg er ved at rive håret ud da jeg skal være færdig mandag morgen.


Avatar billede chries Nybegynder
12. januar 2002 - 21:38 #1
nu skal jeg se om jeg har forstået :-)

du har en moderklasse:
class mother
{
};

du har fire der arver:
class child1 : public mother
{
}

class child2 : public mother
{
}

...


du har oprette dem via new:

mother *pMother1 = new child1;
mother *pMother2 = new child2;
mother *pMother3 = new child3;
mother *pMother4 = new child4;

det du skal gøre for at slette dem er bare at kalde delete:
delete pMother1;
delete pMother2;
delete pMother3;
delete pMother4;

men husk, den sletter kun klassen, ikke evt new\'et indhold i dem. så hvis hvis der er new data i de enkelte instanser, skal de delete\'s først! (evt i destructerne)

(ingen public private for at spare plads)

class child1: public mother
{
  child1()
    { pData = NULL; }
  ~child1()
    { if(!pData) delete pData; }

  void addSomeData()
    {pData = new int(0); }

  int *pData;
}

Avatar billede chries Nybegynder
12. januar 2002 - 21:38 #2
der var jeg for hurtig :-)
if(pData) delete pData;
Avatar billede mbulow Nybegynder
13. januar 2002 - 03:37 #3
Du skal huske at destructoren i \'mother\'-klassen skal være virtuel, ellers vil \'mother\'-destructoren være den eneste der bliver kaldt:

Scenariet er følgende:
----------------------
mother *pMother = new child();
delete pMother;

delete med \'Almindelig\' (ikke-virtuel) destructor:
--------------------------------------------------
1) delete blev kaldt på en \'mother\'-pointer... Jamen så må det jo være et \'mother\'-object
2) \'mother\'-destructoren bliver kaldt.
3) Der bliver rydet op som om det var et \'mother\'-objekt
(Dvs. alt hvad der er blevet allokeret i forbindelse med \'child\' bliver ignoreret.)

delete med \'Virtuel\' destructor:
--------------------------------
1) Fordi destructoren er virtuel, og \'mother\'-pointeren reelt peger på et child-object, bliver child-destructoren kaldt først.
2) Det bliver rydet op i den del at objectet der er specifik for \'child\'.
3) \'mother\'-destructoren bliver kaldt.
4) Det bliver rydet op i den del af objectet der er specifik for \'mother\'
(På den måde bliver alle de forskellige destructorere kaldt i den rigtige rækkefølge)



Håber vi ikke snakker forbi hinanden, men hva\' klokken er jo også 3:40, så jeg er træt og alt kan ske :) Nat nat
Avatar billede tax Nybegynder
13. januar 2002 - 07:06 #4
Jeg har brugt natten på at omstrukturere og ladet alle objekter være indeholdt direkte. Så er det lettere at holde styr på stumperne.

Tak for hjælpen :)
Avatar billede chries Nybegynder
13. januar 2002 - 13:38 #5
damn, jeg troede ikke på det med virtuel destructor, så jeg testede det. Så har jeg vel lært noget nyt igen :-)
Avatar billede tax Nybegynder
13. januar 2002 - 18:39 #6
Jeg har netop støvsuget mit program for disse new, og jeg sletter dem nu igen, men alligevel får jeg dumpede objekter.

Hvordan sporer man hvilke objekter der er tale om?? Kan det lade sig gøre. Jeg har en bytestørrelse at gå efter, men hvordan sporer jeg objekterne op
Avatar billede chries Nybegynder
14. januar 2002 - 08:19 #7
Har du prøvet at d-klikke på dem ?
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