LINUX.ORG.RU

История изменений

Исправление 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]