Avatar billede cbkc. Nybegynder
06. januar 2002 - 22:14 Der er 5 kommentarer

Slette/frigøre plads...

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];
};

LaanerEntry::~LaanerEntry()
{
cout<<\"Slette Laaner\"<<endl;
}

/*------------------------------------------------------------------------*/
class ElementL {
public:
  ~ElementL();
  ElementL * forward,*backward ;
    LaanerEntry * data;
    ElementL(ElementL * f=0,ElementL *b=0, LaanerEntry * d=0);
};

ElementL::~ElementL(){
cout<<\"Slette ElementL\"<<endl;
}

ElementL::ElementL(ElementL * f,ElementL * b, LaanerEntry *d): forward(f),backward(b),data(d) {
}

/*------------------------------------------------------------------------*/
class ListL {
public:
    void remove(ElementL *e);
    ElementL *    search( long int d);
  void search2();
    void    show_list();
    void    show_element(ElementL *p);
  void  change(ElementL *p);
Avatar billede - Nybegynder
06. januar 2002 - 22:25 #1
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.
Avatar billede kamikaze Nybegynder
06. januar 2002 - 23:28 #2
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).
Avatar billede cbkc. Nybegynder
07. januar 2002 - 10:24 #3
Ydligere oplysninger:

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.

Er det helt forkert forstået??

Avatar billede cbkc. Nybegynder
07. januar 2002 - 10:25 #4
PS: Data bliver placeret i ElementL, jvf strukturen i spørgsmålet øverst.
Avatar billede soepro Nybegynder
07. januar 2002 - 15:52 #5
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.)
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