История изменений
Исправление 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]