Avatar billede driis Nybegynder
05. november 2003 - 15:12 Der er 6 kommentarer og
1 løsning

Klassespecifik operator new og delete

Jeg er ved at lave en klassispecifik implementering af operator new og delete. Det ser indtil videre således ud:

template<int dim,typename T>
void * Vector<dim,T>::operator new(size_t n)
{
    const int N = 20 ;        // antal enheder, der skal besilles plads til ad gangen.
    heapBlok * p;
    Vector<dim,T> *q;

    // Hvis lokal heap er tom, allokeres plads til N objekter fra den globale heap
    if ( heapPtr == 0 )
    {
        q = ::new Vector<dim,T>[N];    // global new
        heapTotal += N;
       
        // lav de nye N objekter om til en lineær liste af heapBlok'ke.
        for ( int i = 0 ; i < N-1 ; i++ )
        {
            p = (heapBlok*)&q[i];
            p->next = (heapBlok*)&q[i+1];
        }
        p = (heapBlok*)&q[N-1];
        p->next = 0;
        heapPtr = (heapBlok*)q;        // heap pointer peger på første element i liste.
    }

    heapUsed++;                        // vi "frigiver" en blok, opdater tæller
    // Hægt første blok af listen og returner dens adresse.
    q = (Vector<dim,T> *)heapPtr;
    heapPtr = heapPtr->next ;
    return q;
}

template<int dim,typename T>
void Vector<dim,T>::operator delete(void *p)
{
    heapBlok *q = (heapBlok*)p;

    // blokken, der er returneret, indsættes forrest i listen.
    q->next = heapPtr;
    heapPtr = q;

    // opdater tæller.
    heapUsed--;
}

Mit problem er nu, hvordan får jeg på en effektiv og sikker måde leveret deallokeret plads tilbage til den globale heap, når jeg ikke skal bruge pladsen længere ?
Avatar billede motz Nybegynder
05. november 2003 - 15:22 #1
Du bruger vel bare "delete" i destructoren!!
Avatar billede driis Nybegynder
05. november 2003 - 15:45 #2
motz >> operator new og delete er statiske funktioner. Disse 2 statiske funktioner skal vedligeholde en "lokal heap" for klassen Vector. Dette gøres ved, at Vector::new bestiller plads til 20 Vector's fra den globale heap ad gangen. Når new kaldes, returnerer den en pointer til en Vector. Når de 20 blokke er brugt, bestilles plads til endnu 20 blokke.

Med operator delete leveres én Vector - blok tilbage til den lokale heap. delete indsætter den tilbageleverede blok i listen over frie blokke i den lokale heap.

Mit spørgsmål er nu, hvordan jeg får min delete til at kontrollere, om én af de bestilte blokke på 20 Vector's fra den globale heap, ikke længere bruges - og i såfald levere denne blok tilbage til den globale heap med ::delete.

Håber ovenstående er forståeligt :-)
Avatar billede arne_v Ekspert
05. november 2003 - 18:25 #3
Når du gar new'et en klump på 20 kan du også kun delete en samplet klump
på 20 - du kan ikke delete halvdelen.

SÅ du kan vel teste i operator delete om heapUsed er 0 og i givet
fald kalde delete[] og sætte heapPtr til NULL.
Avatar billede driis Nybegynder
06. november 2003 - 00:33 #4
Korrekt - men jeg vil også gerne tage højde for muligheden, at der f.eks. på et tidspunkt bliver brugt 150 Vector's, hvilket svarer til at jeg har allokeret 8 klumper á 20. Senere er der måske kun 10 Vector's i brug, og jeg leder efter den bedste måde at detektere hvilke - hvis nogen - af de 7 overskydende klumper á 20 der kan slettes - og derefter slette dem.
Avatar billede segmose Nybegynder
06. november 2003 - 09:18 #5
Du skal kunne gå den omvendte vej fra en heapBlok til en Vector<dim,T> (kaldet V)allokering og checke om alle 20 er frigivet, checket er nok lidt vanskeligt enten skal man holde styr på allokeringsenhederne V eller på hvilke heapBlok der hænger sammen.
Avatar billede driis Nybegynder
06. november 2003 - 17:39 #6
Nu har jeg været i gang med at forbedre koden så overskydende plads leveres tilbage til den globale heap. Men det virker ikke:
q = ::new Vector<dim,T>[N];    // global new
I denne linie bliver q konsekvent 4 større end den værdi, new returnerer. Hvordan kan det være ?? Af samme grund har jeg (jeg går ud fra, det er derfor) problemer når jeg senere prøver at delete samme værdi.
Se evt. http://www.driis.mobilixnet.dk/new_fejl.jpg
Avatar billede driis Nybegynder
12. november 2003 - 12:20 #7
Lukker.
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