Я удивлен, что от компилятора нет предупреждения о компиляторе для смешивания -fexceptions и -fno-excptions или специально для смешивания кода с таблицами и без них.Я понимаю, что могут существовать бесконечные законные и / или неконтролируемые способы оказаться в этом состоянии, но я бы предпочел получить раньше std :: terminate (), чем ( установка скучного теста следует ):
runner.cpp
extern void testA();
int main() {
try {
testA();
} catch (...) {}
}
testA.cpp
#include <iostream>
extern void testB();
struct resA {
~resA() { std::cout << "release resA" << std::endl; }
};
void testA() {
resA a;
testB();
}
testB.cpp
#include <iostream>
struct resB {
~resB() { std::cout << "release resB" << std::endl; }
};
void testB() {
resB b;
throw 42;
}
Давайте скомпилируем a.cpp без исключения, но остальные с исключениями, также свяжите все это вместе с исключениями:
clang++ -Wall -Wextra -Wpedantic -O3 -std=c++1z a.cpp -fno-exceptions -c
clang++ -Wall -Wextra -Wpedantic -O3 -std=c++1z b.cpp test.cpp -fexceptions -c
clang++ -Wall -Wextra -Wpedantic -O3 -std=c++1z a.o b.o test.o -fexceptions
Выход: release resB
Мы 'эффективно утечка ресурса A, может быть, огромного, и никто не заметил, что мы можем продолжать работать
Когда все скомпилировано с такими же флагами, все ресурсы очищаются, как и ожидалось, потому что все размотки выполняются правильно
В этом случае даже пометка testA как noexcept не приводит к завершению, когда 'потенциально выбрасывающий' testB бросает