Здравствуйте Аноним, Вы писали:
А>В этом варианте при возникновение исключения вызывается деструктор статического класса, но если я убираю строку "cout <<"XZ\n"<<endl;" (в ф-ии f1() ), то вызова этого деструктора не вижу.
А>А>#include "stdafx.h"
А>#include <iostream.h>
А>void f1();
А>class Ctest
А>{
А>
А> public:
А> int iType; // 1- heap ; 2- stack
А> Ctest(int _iType): iType(_iType) { cout << "test "<<iType<< "\n"<<endl; }
А> ~Ctest() { cout <<"~test "<<iType<< "\n"<<endl; }
А>};
А>int main(int argc, char* argv[])
А>{
А> try
А> //__try
А> {
А> printf("start __try\n");
А> f1(); // - âíåé áóäåò èñêëþ÷åíèå
А> printf("end __try\n");
А> }
А> catch(...)
А> //__except (EXCEPTION_EXECUTE_HANDLER)
А> {
А> printf("__except\n");
А> }
А> printf("end example\n");
А> return 0;
А>}
А>void f1()
А>{
А> Ctest Ct2(2);// 2- stack
А>
А> //cout <<"XZ\n"<<endl;
А> DWORD dw=0;
А> dw = 5/dw;
А> DWORD *pdw=0; *pdw=1;
А> printf("end f1\n");
А>}
А>
Если есть желание чтобы компилятор правильно ловил такие исключения как деление на ноль в С++ try/catch блоках, то для MS Visual C++ нужно включить поддержку для
асинхронных исключений, при этом код заметно распухнет и будет медленнее, но будет все правильно ловить и вызывать деструкторы, по умолчанию она выключена. По Стандарту все исключения синхронные, так что поддержка асинхронных исключений это расширение Стандарт MS'ом.