11. november 2002 - 11:50Der 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? } }
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.
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.
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);
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.
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
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]; }
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;
Du har garanteret ret soepro. Det kan godt være at programmet bare skal suge så meget memory :'-(
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.