12. januar 2002 - 20:09Der 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.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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; }
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
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.