История изменений
Исправление vtVitus, (текущая версия) :
Хороший пример получился. Правда не понятно стандартное это поведение или особенность g++
user@xxx:/tmp$ cat ex2.cc
#include <exception>
#include <iostream>
class Base {
        public:
        virtual ~Base() {
                std::cout << "Base" << std::endl;
        }
        void operator delete(void *p) {
                std::cout << "delete Base " << p << std::endl;
        }
};
void somecall(int i) {
        if (i == 0) throw i;
}
class Test : public Base {
        int i;
public:
        Test(int _i):i(_i){}
        virtual ~Test()
        {
                std::cout << "Test" << std::endl;
                somecall(i);
                close();
        }
        void operator delete(void *p) {
                std::cout << "delete Test " << p << std::endl;
        }
        void close() {
                std::cout << "close " << i << std::endl;
        }
};
void g()
{
        Test * d1 = new Test(0);
        try {
                delete d1;
        }  catch(int i) {
                std::cout << "exception " << i << std::endl;
                d1->close();
                try {
                        delete d1;
                } catch(int i) {
                        std::cout << "no exception " << i << std::endl;
                }
        }
}
int main()
{
  g();
}
user@xxx:/tmp$ g++ ex2.cc
user@xxx:/tmp$ ./a.out
Test
Base
exception 0
close 0
Base
delete Base 0x99e010
Исходная версия vtVitus, :
Хороший пример получился.
Правда не понятно стандартное это поведение или особенность g++
[code=cc]
user@xxx:/tmp$ cat ex2.cc
#include <exception>
#include <iostream>
class Base {
        public:
        virtual ~Base() {
                std::cout << «Base» << std::endl;
        }
        void operator delete(void *p) {
                std::cout << «delete Base » << p << std::endl;
        }
};
void somecall(int i) {
        if (i == 0) throw i;
}
class Test : public Base {
        int i;
public:
        Test(int _i):i(_i){}
        virtual ~Test()
        {
                std::cout << «Test» << std::endl;
                somecall(i);
                close();
        }
        void operator delete(void *p) {
                std::cout << «delete Test » << p << std::endl;
        }
        void close() {
                std::cout << «close » << i << std::endl;
        }
};
void g()
{
        Test * d1 = new Test(0);
        try {
                delete d1;
        }  catch(int i) {
                std::cout << «exception » << i << std::endl;
                d1->close();
                try {
                        delete d1;
                } catch(int i) {
                        std::cout << «no exception » << i << std::endl;
                }
        }
}
int main()
{
  g();
}
user@xxx:/tmp$ g++ ex2.cc
user@xxx:/tmp$ ./a.out
Test
Base
exception 0
close 0
Base
delete Base 0x99e010
[/code]