Какое последнее предложение ниже, выделенное жирным шрифтом, имеет отношение к копированию брошенного исключения? - PullRequest
8 голосов
/ 20 января 2012

Это отрывок из книги Страуступа, 3-е издание, на странице 362:

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

Ответы [ 4 ]

9 голосов
/ 20 января 2012

Это означает, что если вам не хватит памяти и вызов new () сгенерирует std :: bad_alloc, будет зарезервировано некоторое количество памяти для создания и создания правильного количества копий объекта std :: bad_alloc безбросание другого std :: bad_alloc в результате процесса выброса исключения.

6 голосов
/ 20 января 2012

Обычно, когда вы throw исключение, это двухэтапный процесс:

  1. Исключение локально создается в стеке
  2. Выдается исключение, которое включаетсоздание копии, хранящейся «где-то», и уничтожение временного хранилища, находящегося в стеке.

Стандарт гарантирует, что в случае, если вам больше не будет доступной памяти, в системе все еще будет достаточно памятичтобы иметь возможность throw a std::bad_alloc исключение.

Существует несколько доступных стратегий:

  • просто где-то статически размещается исключение, и "фальшивый" бросает его (простопередавая ссылку на статическую)
  • зарезервировать некоторое пространство (достаточно) для исключения
  • ...

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

2 голосов
/ 20 января 2012

это означает, что если вы вводите новый и недостаточно памяти для выделения чего-либо (то есть у вас полностью не хватает памяти), в системе все равно будет предварительно зарезервированный буфер, достаточно большой для создания 'bad_alloc''исключение и выбросить его.

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

1 голос
/ 20 января 2012

Это просто означает, что new всегда будет правильно генерировать исключение bad_alloc, когда не может должным образом создать запрошенный объект, даже несмотря на то, что материал, упомянутый ранее, предполагает, что это невозможно Но любая реализация должна убедиться, что она работает любым способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...