Доброго времени суток!
try
{
int * a = new int [100];
// что-то делаем с массивом a
delete [] a;
delete [] a;
}
catch (...)
{
//
}
Подскажите, пожалуйста, почему не ловится исключение? И как его правильно ловить, для случаев, когда делаю delete / delete [] для уже удаленных объектов?
Здравствуйте, Аноним, Вы писали:
А>А>try
А>{
А> int * a = new int [100];
А> // что-то делаем с массивом a
А> delete [] a;
А> delete [] a;
А>}
А>catch (...)
А>{
А> //
А>}
А>
А>Подскажите, пожалуйста, почему не ловится исключение?
Потому что
C++ исключение здесь никто и не бросает. Из того, что какая-то штука в произвольном контексте называется исключением, не следует, что эта сущность должна пониматься рантаймом и/или компилятором C++
А> И как его правильно ловить, для случаев, когда делаю delete / delete [] для уже удаленных объектов?
Никак.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Поздно будет ловить исключения когда вывалиться access violation или segmentation fault
Может подумать об STL и автоматических указателях?
Здравствуйте, <Аноним>, Вы писали:
А>Подскажите, пожалуйста, почему не ловится исключение? И как его правильно ловить, для случаев, когда делаю delete / delete [] для уже удаленных объектов?
Потому что это не исключительное, а
неопределённое поведение.
И, в лучшем случае, второй delete[] (вырожденный здесь до free()) просто ничего не сделает, а в худшем — ты приведёшь кучу в несогласованное состояние и получишь море спецэффектов спустя некоторое время работы программы.
К сожалению, сишный/плюсовый менеджер кучи не защищён от неправильного использования.
Но даже если бы он был защищён — вызов delete/delete[] для типа с нетривиальным деструктором привёл бы сперва к (повторному) вызову деструктора, а эту ситуацию дёшево распознать невозможно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>