Avatar billede dehdar Nybegynder
18. november 2008 - 10:46 Der er 5 kommentarer og
1 løsning

Basalt destructor spørgsmål

Jeg er ved at skrive en lokal heap og er kommet i tvivl om, hvordan jeg skal håndtere destructoren. I denne anledning vil jeg spørge om følgende:

Hvis vi f.eks. har en constructor:

constr()
{
  p = new char [2000];
}

og senere i programmet f.eks. skriver

p = &p[50];

vil destructoren, så ikke kun rydde op fra plads 50 til 2000, hvis jeg skriver:

~des
{
  delete []p;
}

Jeg kunne jo selvfølgelig skrive delete []p[0]; hvis dette er tilfældet, men det vil så skulle håndteres anderledes i mit program.
Avatar billede dehdar Nybegynder
18. november 2008 - 10:48 #1
Glem det sidste jeg skrev. Det var noget sludder:

"Jeg kunne jo selvfølgelig skrive delete []p[0]; hvis dette er tilfældet, men det vil så skulle håndteres anderledes i mit program."

Jeg kan i stedet skrive delete[] (p-50); vil jeg mene.
Avatar billede arne_v Ekspert
18. november 2008 - 14:41 #2
Hvis du kalder delete paa en pointer som ikke er new'et, saa mener jeg ikke at den deallokerer
noget som helst.
Avatar billede lars314 Nybegynder
20. november 2008 - 08:08 #3
Du bør bruge en std::vector istedet eller måske en std::auto_ptr
Avatar billede dehdar Nybegynder
22. november 2008 - 16:05 #4
Tak for begge svar. Jeg har løst problemet på følgende måde. Mit problem før var, at jeg rokerede rundt på rawMemoryPtr i mit program, således at den plads pointeren pegede på blev opdateret, men nu bruger jeg i stedet poolPtr til at rokere rundt på, så det skulle ikke give noget problem.

Jeg kan dog forstå på dig Arne, at hvis jeg f.eks. lavede en delete til en pointer, som jeg satte til at pege på rawMemoryPtr, så vil intet blive deallokeret noget? I er begge velkommen til at smide et svar.

RawBlockPool::RawBlockPool(unsigned blockSize, unsigned blockNumber )
{
    rawMemoryPtr = new char[ blockSize * blockNumber];
    poolPtr = (Block*) rawMemoryPtr;
   
    if( poolPtr != NULL )
    {
        for( int i = 0; i < (blockNumber - 1); i++ )
        {
            poolPtr[i * blockSize].next = &poolPtr[( i + 1 ) * blockSize];
        }
        poolPtr[( blockNumber - 1 ) * blockSize ].next = NULL;
    }
    else
        exit(1);
}
   

RawBlockPool::~RawBlockPool()
{
    delete [] rawMemoryPtr;
}
Avatar billede arne_v Ekspert
22. november 2008 - 21:28 #5
Din rawMemoryPtr er new'et, så den kan delete's.

Men i dit spørgsmål sætter du p til at pege på element nummer 50 og kalder så
delete på den.

Det er undefined i C++, men jeg tror roligt at du kan regne med at der ikke
en deallokering. Er du heldig sker der ingenting. Er du uheldig så trasher den
hele dynamisk memory allokering.

C:\>type m1.cpp
#include <iostream>

using namespace std;

const int N = 1000000;

int main()
{
    cout << "new new new delete delete delete" << endl;
    int *a = new int[N];
    cout << (int)a << endl;
    int *b = new int[N];
    cout << (int)b << endl;
    int *c = new int[N];
    cout << (int)c << endl;
    delete[] a;
    delete[] b;
    delete[] c;
    return 0;
}

C:\>g++ m1.cpp -o m1.exe

C:\>m1
new new new delete delete delete
5242912
9306144
13369376

C:\>type m2.cpp
#include <iostream>

using namespace std;

const int N = 1000000;

int main()
{
    cout << "new delete new delete new delete" << endl;
    int *a = new int[N];
    cout << (int)a << endl;
    delete[] a;
    int *b = new int[N];
    cout << (int)b << endl;
    delete[] b;
    int *c = new int[N];
    cout << (int)c << endl;
    delete[] c;
    return 0;
}

C:\>g++ m2.cpp -o m2.exe

C:\>m2
new delete new delete new delete
5242912
5242912
5242912

C:\>type m3.cpp
#include <iostream>

using namespace std;

const int N = 1000000;

int main()
{
    cout << "new fakedelete new fakedelete new fakedelete" << endl;
    int *a = new int[N];
    cout << (int)a << endl;
    int *aa = &a[1];
    delete[] aa;
    int *b = new int[N];
    cout << (int)b << endl;
    int *bb = &b[1];
    delete[] bb;
    int *c = new int[N];
    cout << (int)c << endl;
    int *cc = &c[1];
    delete[] cc;
    return 0;
}

C:\>g++ m3.cpp -o m3.exe

C:\>m3
new fakedelete new fakedelete new fakedelete
5242912
9306144
13369376

Endvidere:

m3 kører videre uden at deallokere - GNU, MS
m3 crasher - Borland
Avatar billede dehdar Nybegynder
19. februar 2009 - 10:58 #6
gammel tråd, lukkes.
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