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;
}