Подорожуй з gofrie.com

bad catching exceptions


struct bad 
{
    int * _a, *_b;

    bad(int n, int m): _a(new int[n]),_b(new int[m])
    { 
        cout<<"constructor succeded"<<endl; 
    }

    ~bad() 
    {
        cout<<"destructor is called"<<endl;
        delete [] _a;
        delete [] _b; 
    }
};

int main() 
{
    try 
    {
        bad A(1,-3);
    }
    catch (bad_alloc& ba) 
    {
        cout<< "bad_alloc caught: " << ba.what() << endl;
    }

    return 0;
}


Структура bad містить в собі два вказівника на int. Конструктор з параметрами n та m виділяє пам’ять під масиви відповідних розмірностей. Очевидно, що при виклику конструктора з параметрами 1 та -3 ми отримаємо bad allocation.

Якщо протестувати даний код то не побачимо ні «constructor succeded» ні «destructor is called». Чому ми не бачимо повідомлення про вдале виконання конструктора – це зрозуміло. Деструктор не буде виконаним тому що bad A не був вдало створеним. Але насправді ми отримаємо bad allocation вже після вдалого виділення пам’яті для масиву _a. Тобто з’являється сміття у пам’яті.