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. Тобто з’являється сміття у пам’яті.
- +1
- 03 червня 2013, 20:14
- NiddHogg
- Залишити коментар