РЕДАКТИРОВАТЬ: Оказалось, я был смущен уничтожением f
второй аргумент, который является копией tmp
. Подробности смотрите в моем ответе ниже.
Итак, я экспериментировал с раскруткой C ++ и пришел к этому странному поведению, когда у нас есть вложенные блоки try-catch, а во внешнем мы построили объект. Кажется, что этот объект разрушается в точке перехвата исключения в одном из внутренних обработчиков try-catch.
Также, если мы используем динамическое выделение памяти c, как я показал в этом примере (мы используем new
в конструкторе и delete
в деструкторе) программа, похоже, выдает сообщение c о диагностике во время выполнения.
Рассмотрим этот код:
#include <stdio.h>
struct test {
test(int);
~test() throw(int);
int *b;
};
void f5() {
if (!printf(""))
throw 9;
}
test f(int, test) throw(int) { test tmp(6); f5(); return tmp; }
test::test(int a) : b(new int(a)) { printf("constructor test@%d\n", *b); }
test::~test() throw(int)
{
printf("destructor test@%d\n", *b);
delete b;
}
int main() {
test tmp(0);
try {
test tmp(1);
try {
f(7, tmp);
}
catch (int) {
printf("catch(int)@%d\n", 2);
try {
test tmphandler(3); f(7, tmp);
}
catch (int) {
printf("catch(int)@%d\n", 4);
}
}
printf("b = %d\n", *tmp.b);
f(7, tmp);
}
catch (int) { printf("catch(int)@%d\n", 5); }
}
Вот это wandbox вывод этой программы:
*** Error in `./prog.exe': double free or corruption (fasttop): 0x00000000020ee180 ***
....back-trace of addresses
constructor test@0
constructor test@1
constructor test@6
destructor test@6
destructor test@1
catch(int)@2
constructor test@3
constructor test@6
destructor test@6
destructor test@3
destructor test@33722768
Я изо всех сил пытаюсь понять, почему в точке catch @ 2 объект во внешней области действия try разрушен (т.е. объект создан @ 1 ).