2016-04-19 10 views
0

Если мы рассмотрим следующий код с 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 в основную функцию, поскольку я благодарен за возможность отследить исключение до того момента, когда он испускается в отладчике.

ответ

0

Вы имеете дело с определенным поведением реализации. Согласно стандарту [except.handle]

Если ни один обработчик соответствия не найден, то функция называется std::terminate(); ли не стек раскручивается до этого вызова std::terminate() является реализацией определенных

Так g может или не может быть уничтожен на основе того, что реализация вы используете. Вы не сможете полагаться на это, всегда обрабатывая то же самое.

+0

Благодарим вас за этот точный ответ. Должен сказать, что это неопределенное поведение довольно расстраивает. В самом деле, я не знал, что нужно установить обработчик исключений, чтобы убедиться, что RAII работает во всех случаях. – Thomas

 Смежные вопросы

  • Нет связанных вопросов^_^