Подтвердить что ты не робот

Если я выпрыгнул из блока catch с "goto", я уверен, что объект-исключение будет свободен?

У меня есть следующий код:

try {
  doSomething();
} catch(InterruptException) {
  goto rewind_code;
}

if(0) {
rewind_code:
  longjmp(savepoint, 1);
}

Мой вопрос в том, является ли объект исключения, хранящийся во время выполнения С++, когда я goto вышел из блока catch? Или время выполнения позволяет кэшировать его до тех пор, пока не будет создана окружающая функция или что-то в этом роде? Я просто хочу убедиться, что если я выполняю над кодом несколько раз, каждый раз, когда вы переписываете код перезаписи, я не буду утечки памяти (потому что longjmp не будет выполнять код очистки, испускаемый компилятором, в или до пролог функций).

4b9b3361

Ответ 1

§6.6/2:

При выходе из области действия (как бы это ни было выполнено) деструкторы (12.4) вызываются для всех построенных объектов с автоматическим временем хранения...

По крайней мере, так как я прочитал его, "как бы он ни был выполнен" должен включать/включать goto.

Редактирование: Хорошо, на основе комментария Йоханнеса, нас интересует §15.1/4:

Когда последний обработчик выполняется для исключение выходит любым способом, кроме броска; временный объект уничтожается и реализация может освободить память для временного объекта;

[...]

Разрушение происходит сразу же после уничтожения объекта, объявленного в объявлении исключения в обработчике.

Ответ 2

§ 15.1.4

Память для объекта исключения выделяется в неуказанном, за исключением случаев, указанных в п. 3.7.4.1. Если обработчик завершает восстановление, управление передается другому обработчику для того же исключения. The объект исключения уничтожается после того, как последний оставшийся активен обработчик исключений исключает любым способом, кроме повторного создания, или последний объект типа std:: exception_ptr (18.8.5), который ссылается на объект исключения уничтожается, в зависимости от того, что наступит позже. В первом случае, разрушение происходит, когда обработчик выходит, сразу после уничтожение объекта, объявленного в декларации исключения в обработчик, если таковой имеется. В последнем случае разрушение происходит до Деструктор std:: exception_ptr возвращается. Затем реализация может освободить память для объекта исключения; любое такое освобождение выполняется неуказанным способом.