Если мы рассмотрим следующий код с g ++ или clang, деструктор класса Guard не будет вызываться, если исключение не будет найдено, по крайней мере, в основной функции , Я сделал свой гуглинг и не нашел полезной информации.Охрана в C++, деструктор не вызывается, когда исключение не обрабатывается в основном
Я использую класс охраны на участке для реализации RAII. Таким образом, я обнаружил, что это совершенно разочаровывает, в частности, когда речь идет о ressources, например семафоре.
Я, хотя это C++ требует вызова деструктора при вызове исключения. Является ли это стандартным поведением или является ли это реализацией libstdC++?
Благодарим вас за помощь или совет по этому вопросу.
#include<iostream>
#include<memory>
struct Guard
{
Guard()
: v(new int)
{
std::cout << "Guard()" << std::endl;
}
~Guard(){
std::cout << "~Guard()" << std::endl;
delete v;
}
private:
int *v;
};
void test(){
auto g = std::make_shared<Guard>();
throw("youch");
}
void test2(){
test();
}
int main(void){
// try{
test2();
// } catch(...){
// }
return 0;
}
P.S. : Я не хочу добавлять блок try/catch в основную функцию, поскольку я благодарен за возможность отследить исключение до того момента, когда он испускается в отладчике.
Благодарим вас за этот точный ответ. Должен сказать, что это неопределенное поведение довольно расстраивает. В самом деле, я не знал, что нужно установить обработчик исключений, чтобы убедиться, что RAII работает во всех случаях. – Thomas