Исключения при выделении памяти - PullRequest
2 голосов
/ 17 сентября 2011

Я только что узнал, что вы можете генерировать или обрабатывать исключения, если распределение памяти не было успешным.Но здесь я не видел, чтобы многие люди обрабатывали исключения при использовании new operator.

Например: не может ли следующее произойти сбой в любой точке программы?

char* c = new char[1000];
delete []c;

А как вы должны обрабатывать исключения, если таковые имеются?

Ответы [ 2 ]

3 голосов
/ 17 сентября 2011

new выдает исключение std :: bad_alloc вы должны перехватить его, используя try-catch блок:

try
{
    char* c = new char[1000];
}
catch(std::bad_alloc &except)
{

}

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

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

2 голосов
/ 17 сентября 2011

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

В некоторых случаях может иметь смысл перехватить исключение std::bad_alloc, например, если программа может попытаться использовать альтернативный подход при неудачном выделении большого блока памяти. Это применимо только в некоторых системах; в системе, которая перегружает память, умозрительно выделяя большой блок памяти и ожидая, что std::bad_alloc завершится неудачей.

Явный перехват bad_alloc для выполнения очистки обычно является признаком того, что ресурсы не управляются соответствующими экземплярами классов в стиле RAII, которые должны выполнять правильную очистку в деструкторе, гарантируя, что это происходит всякий раз, когда Область действия оставлена, по какому-либо исключению или иным образом.

...