Avatar billede anadan Nybegynder
11. november 2002 - 11:50 Der er 13 kommentarer og
1 løsning

Memory håndtering

Jeg har skrevet et program der bruger en
struct Block{int data[8][8];};
for at kunne returnere et int[][] fra en metode.
Men hvordan i min deconstructor sletter jeg både det array der ligger i Block, og selve Block struct'en?

class MyClass{
  Block block;
  MyClass(int data[][8]){
      cpy(data, block.data)
      //metode der kopierer data til block.data
      delete data ??? Hvad her?
  }
  ~MyClass(){
      delete ??? Hvad her?
  }
}
Avatar billede kamikaze Nybegynder
11. november 2002 - 11:59 #1
Jamen, du behøver vel ikke delete det? Det behøver du kun hvis du explicit har brugt new eller malloc. Eller har jeg misset noget?!?!?
Avatar billede tosssen Nybegynder
11. november 2002 - 11:59 #2
Så vidt jeg ved slettes Block structen inklusiv array automatisk efter destructoren er blevet kørt. Det er kun hvis du har oprettet Block ved hjælp af new at det er nødvendigt at frigøre hukommelsen manuelt.
Avatar billede anadan Nybegynder
11. november 2002 - 12:01 #3
Jeg er rimelig sikker på at det er der fejlen ligger. Mit program løber i ca 10 sek. og suger 100MB RAM...
Avatar billede tosssen Nybegynder
11. november 2002 - 12:03 #4
En variabel har normalt samme levetid som den funktion eller klasse den er blevet erklæret i. Det kan kun omgås ved brug af new, og da du ikke har brugt new har du ikke noget problem.
Avatar billede tosssen Nybegynder
11. november 2002 - 12:04 #5
Kan du så ikke prøve at poste noget mere af din kode?
Avatar billede kamikaze Nybegynder
11. november 2002 - 12:05 #6
Du bliver nok nødt til at poste lidt mere kode...
Avatar billede kamikaze Nybegynder
11. november 2002 - 12:08 #7
Hvordan ser din cpy metode ud? Det lyder som om det kunne være der den er gal!
Avatar billede anadan Nybegynder
11. november 2002 - 12:12 #8
void cpy(int a[][8], int b[][8]){
    for(int i=0; i<8; i++){
        for(int j=0; j<8; j++){
            b[i][j]=a[i][j];
        }
    }
}
int sol[8][8];
//fylder sol op med data her vha dobbelt for
MyClass c = new MyClass(sol);
Avatar billede tosssen Nybegynder
11. november 2002 - 12:21 #9
Memoryproblemet må ligge omkring new operatoren du bruger i linien
MyClass c = new MyClass(sol);
Det er også muligt at problemet kan ligge der hvor du fylder sol op med data vha dobbelt for.
Lidt mere kode ville være fint.
Avatar billede anadan Nybegynder
11. november 2002 - 12:51 #10
Ikke fordi det vil give stor mening, men sådan fylder jeg sol op:
            for (i=0; i<queens.size(); i++) {
                q = queens[i];
                pl = q->placering;
                sol[pl->getX()][pl->getY()]=1;
                delete q;
            }
Jeg ville gå ud fra at når jeg er færdig med min instans af MyClass (der er en MyClass *c) kunne jeg slette den med delete, og den burde kalde deconstructoren, hvor jeg kunne slette min struct
Avatar billede soepro Nybegynder
11. november 2002 - 12:52 #11
Er der ikke noget grundlæggende forkert i den måde du laver ovenstående på ? Hvis du VED at din int matrix er på 8 x 8 elementer (Faste indeks længder i din cpy() metode), burde du så ikke lave en dedikeret klasse eller struct typedef til det ?

Hvad mener du med at returnere en int[][] fra en metode ? Det kan man da sagtens - men det er jo en pointer. Hvis det er indholdet du vil ændre i, kan du bare bruge reference (&):

const int xDim = 8;
const int yDim = 8;
typedef int[yDim][xDim] SIntArray;

void danArray(SIntArray& a, int b[yDim][xDim])
{
  for (int i=0; i<yDim; i++)
    for (int j=0; j<xDim; j++)
      a[i][j] = b[i][j];
}
Avatar billede tosssen Nybegynder
11. november 2002 - 12:53 #12
Din Block struct slettes automatisk når du deleter instansen af MyClass
Avatar billede soepro Nybegynder
11. november 2002 - 13:31 #13
Anadan >> Ooops, hvad er det for en delete q; ? Du skal KUN -gentager KUN- lave delete af variabler du har lavet vha. new operatoren - og kun i samme antal som du laver new !

int[] q;

for (i=0; i<queens.size(); i++) {
  q = queens[i];
  pl = q->placering;
  sol[pl->getX()][pl->getY()]=1;
  // delete q; NEJ, NEJ - er bare en pointer som forsvinder når
  // q går out of scope. HER sletter du faktisk data-bidden til
  // queens[i] !!!
}

For at svare på dit allereførste spørgsmål, så skal du IKKE LAVE DELETE nogen steder, sådan som du har defineret din klasse. (Du bruger jo ikke new til at lave Block, så den forsvinder af sig selv, når block går out of scope, dvs. når din klasse ikke bruges mere.

class MyClass{
  private: // Vi skal ikke have nogen til at pille direkte i dataene.
  Block block;

  public: // Ellers kan du ikke tilgå metoderne uden for klassen.
  MyClass(int data[8][8]) {
    cpy(data, block.data)
  };
  ~MyClass(){
    // Default destructor er nok.
  }
}

Når du så skal bruge den, skal du ENTEN lave en direkte instans:

MyClass varA;
:
:

ELLER dynamisk allokere OG slette:

// Skal til at bruge den
MyClass *pVarA = new MyClass();
:
:
:
// Færdig med at bruge den.
delete pVarA;
Avatar billede anadan Nybegynder
11. november 2002 - 13:44 #14
Du har garanteret ret soepro. Det kan godt være at programmet bare skal suge så meget memory :'-(
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