Nedenstående er et udklip af en kode der består af 3 klasser. Klassen ListL bruger de to foregående vha. pointere og NEW ---. Mit spørgsmål er så om det er tilstrækkeligt at skrive: Delete \'pointer laaner\'; Delete \'pointer ElemtL\' , eller om der skal tilføjes ~klasse, som i nedenstående, eller om det er nok at skrive: Delete \'pointer ElementL;\' ??
//klasse til laanerdata. class LaanerEntry { public: ~LaanerEntry(); long int laanernr; //Automatisk tildeling nummer. char name[80]; char gadevej[80]; char postby[80]; char tlf[20]; long int laantnr[10]; //kan udvides til også at holde tidspunkt for lån. long int reserv[3]; };
hvad jeg forstår ud fra dit spørgsmål er det nok med delete LaanerEntry/ElementL. Men hvis du også opretter ListL dynamisk bør du have en default destructor der som så nedlægger alle dine LaanerEntry/ElementL. Default destructoren bliver kaldt når et objekt deletes men hvis der ikke skal ske noget specielt behøves den ikke være der.
En grundregel er, at der skal bruges ligeså mange \'delete\' kald som der er \'new\' kald. new allokerer memory, og delete frigiver den igen, og et godt sted at rydde op efter sig er i destructoren.
I din kode fremgår det ikke hvad du bruger new til at allokere, så det er ikke til at sige hvad du skal huske at slette.
ElementL::~ElementL(); // Dette er destructoren, og den sletter ikke noget allokeret memory i sig selv, men kun hvis den kalder delete i koden. Destructoren bliver kaldt enten når du sletter objektet eller programmet stopper (og dermed stopper objekternes levetid).
ListL bliver kaldt fra main som: ListL LL; ListL køre hele tiden, og bliver således ikke slettet(før hele programmet lukker).
I ListL oprettes først en Laaner: Laanerentry * data = NEW Laanerentry; diverse kode-- Og dernæst et element: ElementL * p = NEW ElementL; diverse kode--
Som jeg forstår ovenstående svar, er det tilstrækkeligt at skrive følgende ved sletning: Delete p->Data; delete p;
(ListL bliver \'aldrig\' slettet) Og det er dermed ikke nødvendigt at indføre destruktoren i Laaner og ElementL. Og hvis jeg forstår Kamikaze rigtigt, skal der i Klasse::~Klasse() skrives hvad der skal slettes, før det får nogen effekt af oprette ~Klasse.
Det er kun hvis du anvender new i din coinstructor til klassen til f.eks. at få afsat plads til dine private klasse-variabler, at du skal bruge en tilsvarende delete i destructoren:
class minKlasse::minKlasse(int v) { pV = new Integer(v); } class minKlasse::~minKlasse(void) { delete pV; }
Helt generelt skal man bruge delete på de variabler der instantieres vha. new, inden de går out-of-scope, ellers laver du memory-leak:
void minFunction(void) { minKlasse *pK = new minKlasse();
// Kode
// Så går pK snart out-of-scope delete pK; } // minFunction
Hvis derimod du instantierer direkte, behøver du ikke (må du ikke) lave delete:
void minFunktion(void) { minKlasse V;
// Noget kode
// Out-of-scope - men her rydder compileren selv op. }
Som Jens B (vist ?) skrev i et tidligere indlæg, bliver variabler der instatieres vha. new lagt på heap\'en, mens variabler der instantieres direkte ligger på stakken - og sidstnævnte sørger compileren for at holde \"i orden\". (Der ved compilerne hvornår du er færdig med variablen - nemlig når den går out-of-scope.)
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.