delete два раза одного объекта
От: Аноним  
Дата: 25.11.09 13:57
Оценка:
Доброго времени суток!


try 
{
  int * a = new int [100];
  // что-то делаем с массивом a
  delete [] a;
  delete [] a;
}
catch (...)
{
 //
}

Подскажите, пожалуйста, почему не ловится исключение? И как его правильно ловить, для случаев, когда делаю delete / delete [] для уже удаленных объектов?
Re: delete два раза одного объекта
От: Тот кто сидит в пруду Россия  
Дата: 25.11.09 14:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>try 
А>{
А>  int * a = new int [100];
А>  // что-то делаем с массивом a
А>  delete [] a;
А>  delete [] a;
А>}
А>catch (...)
А>{
А> //
А>}
А>

А>Подскажите, пожалуйста, почему не ловится исключение?

Потому что C++ исключение здесь никто и не бросает. Из того, что какая-то штука в произвольном контексте называется исключением, не следует, что эта сущность должна пониматься рантаймом и/или компилятором C++

А> И как его правильно ловить, для случаев, когда делаю delete / delete [] для уже удаленных объектов?


Никак.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: delete два раза одного объекта
От: TimurSPB Интернет  
Дата: 25.11.09 14:31
Оценка:
Поздно будет ловить исключения когда вывалиться access violation или segmentation fault
Может подумать об STL и автоматических указателях?
Make flame.politics Great Again!
Re: delete два раза одного объекта
От: Кодт Россия  
Дата: 25.11.09 14:45
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

А>Подскажите, пожалуйста, почему не ловится исключение? И как его правильно ловить, для случаев, когда делаю delete / delete [] для уже удаленных объектов?


Потому что это не исключительное, а неопределённое поведение.
И, в лучшем случае, второй delete[] (вырожденный здесь до free()) просто ничего не сделает, а в худшем — ты приведёшь кучу в несогласованное состояние и получишь море спецэффектов спустя некоторое время работы программы.

К сожалению, сишный/плюсовый менеджер кучи не защищён от неправильного использования.
Но даже если бы он был защищён — вызов delete/delete[] для типа с нетривиальным деструктором привёл бы сперва к (повторному) вызову деструктора, а эту ситуацию дёшево распознать невозможно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[2]: delete два раза одного объекта
От: Юрий Жмеренецкий ICQ 380412032
Дата: 26.11.09 04:32
Оценка: 3 (2)
Здравствуйте, Кодт, Вы писали:

К>К сожалению, сишный/плюсовый менеджер кучи не защищён от неправильного использования.

К>Но даже если бы он был защищён — вызов delete/delete[] для типа с нетривиальным деструктором привёл бы сперва к (повторному) вызову деструктора, а эту ситуацию дёшево распознать невозможно.

[windows specific]

Начиная с XP SP3 можно детекировать повреждение кучи с помощью HeapSetInformation + HeapEnableTerminationOnCorruption. В определенной степени это костыль (и я не знаю насколько это затратно по производительности при нормальном выполнении), но со своими задачами справляется. Работает в тех случаях когда повреждена нативная куча (к чему приводит пример автора топика).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.