Avatar billede karas Nybegynder
08. maj 2009 - 00:25 Der er 2 kommentarer og
1 løsning

new/delete overload & exceptions

Jeg prøver at overloade operator new/delete så jeg kan benytte en "arena" til memory allokeringen.
Det fungerer tilsyneladende også i de "normale" situationer, men ikke når konstruktøren på det nye object kaster en exception.

Så vidt jeg forstår, så skal den tilhørende "operator delete" (hvis en sådan findes) kaldes, hvis konstruktøren på objektet allokeret med "operator new" kaster en exception. Det ser bare ikke ud til at det sker.

Jeg bruger gcc 4.4.0. Følgende kode deallokerer ikke memory'en som 2. instans af Message optager med mindre man indkommenterer try-catch blokken (hvilket ikke burde være nødvendigt). Som koden er neden for, så burde memory'en blive allokeret og deallokeret 2 gange, men bliver kun deallokeret 1 gang.

Kopier følgende kode ind i "main.cpp" og kompiler med fx "gcc main.cpp -lstdc++"


#include <iostream>
using namespace std;

struct Arena {
    void* allocate(std::size_t s) {return ::operator new(s);}
    void deallocate(void* p) { ::operator delete(p); }
};

inline void* operator new(std::size_t sz, Arena& a)
{
    void* p = a.allocate(sz);
    cout << "allocate " << p << endl;
    return p;
}

inline void operator delete(void* p, Arena& a)
{
    cout << "dealloc " << p << endl;
    a.deallocate(p);
}

struct Thrower {
    Thrower(bool b) { if (b) throw 1;}
};

int main()
{
    Arena arena;

    Thrower* p = new(arena) Thrower(false);
   
    operator delete(p, arena);

    //try {
        p = new(arena) Thrower(true); // <- Memory bliver ikke deallokeret
    /*}
    catch (...) {
        cout << "catch" << endl;
    }*/

    return 0;
}
Avatar billede karas Nybegynder
08. maj 2009 - 00:27 #1
...som 2. instans af Message optager...

skulle have været:

...som 2. instans af Thrower optager...
Avatar billede karas Nybegynder
08. maj 2009 - 23:08 #2
Det er tilsyneladende et valg gcc folkene har lavet og det har det ret til ifølge standarden:

15.5.1 P 2
In the situation where no matching handler is found, it is implementation-defined whether or not the stack is unwound before terminate() is called.
Avatar billede segmose Nybegynder
11. maj 2009 - 01:00 #3
Har du set på http://www.parashift.com/c++-faq-lite/exceptions.html?

Nu er det meget kedeligt hvis ens constructor fejler så meget at den må kaste håndklædet, jeg forsøget at undgå at det kan ske ... out of memory er som regel alligevel enden på de fleste system.

Her har du dog styr på new, så du kunne catche fejl i default new (dvs. i constructor) og kalde din destructor der, så burde du have dem.
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