У нас есть класс, семантическое поведение как следующее: -Бросающие деструкторы, коррупция памяти?
struct Sample
{
~Sample() throw()
{
throw 0;
}
};
void f()
{
try
{
delete new Sample;
}
catch (...){
}
}
Я знаю, что бросать исключения в dtors зло; но отказ от ресурса библиотеки сторонних организаций бросает исключение (но может быть немедленно восстановлен, что-то странное!). Существует также пул этого ресурса, например массив/контейнер класса Sample. Итак, рассмотрим два случая: уничтожение динамически выделенного объекта и уничтожение динамически выделенного массива объектов.
В настоящее время приложение аварийно падает в разных точках исполнения только тогда, когда используется версия массива (пул). Мы полагаем, что это связано с повреждением памяти, но почему же работает эта неохлаждаемая версия ?.
Что происходит с выделенной памятью? Это неопределенное поведение? Что происходит в случае массива? Должны ли вызываться dtors (по крайней мере, а не память) всех элементов массива (скажем, если dtor первого элемента бросает)?
Спасибо заранее,
EDIT-1: Ну, мы отслеживали его вниз к dtors некоторых массивов элементов не называется. Но выделенная память, кажется, не имеют проблем ... Ниже раздел 5.3.5.7 из SC22-N-4411.pdf)
If the value of the operand of the delete-expression is not a null pointer value, the delete-expression will
call a deallocation function (3.7.4.2). Otherwise, it is unspecified whether the deallocation function will be
called. [ Note: The deallocation function is called regardless of whether the destructor for the object or some
element of the array throws an exception. —end note ]
< \ надрез>
Похоже, память всегда освобождается в таких случаях. Правильно ли я интерпретирую стандарт?
Currenly Я не хочу изменять класс Sample. Я знаю abt std :: terminate() и т. Д. Имея спецификацию throw(). для dtor также бесполезно, поскольку это не помешает любым исключениям избежать или не допустить, чтобы кто-то бросал. Мой вопрос более склонен к тому, что происходит с памятью? Выпущена ли она? Протекает ли он? Или это Неопределенное поведение? Цитирование стандартных разделов C++ поможет. – Abhay
O.K. Для меня тоже стандарт C++. Единственная причина, по которой я спрашиваю; если я хочу запретить исключение/исключение из dtors в моем текущем проекте, мне понадобится помощь «spec lawyer's» :-) – Abhay