2016-07-01 5 views
3
class AutoSomething 
{ 
public: 
    AutoSomething(Object& ob) 
     : object_(object) 
    {} 

    ~AutoSomething() 
    { 
     object_.some_callback(); 
    } 

private: 
    Object& object_; 
}; 

......... 

void Object::some_function() 
{ 
    AutoSomething some(*this); 

    some_function_which_may_throw_exception(); 
} 

질문은 AutoSomething의 소멸자가 호출 될 때 Object 상태가 정상이 될 것입니까?스택을 푸는 동안 RAII를 사용하는 것이 안전합니까?

+0

상태가 양호하다는 것은 무엇을 의미합니까? 'AutoSomething'의 dtor가 호출되고'Object :: some_callback()'이 호출된다는 것이 사실입니다. – songyuanyao

+0

소멸자에서 프로그램을 throw하는 함수를 호출하면 프로그램이 종료됩니다. 일반적으로 콜백 함수가하는 일을 제어하지 않기 때문에 소멸자에서 calbacks를 호출하지 않아도됩니다. – Galik

+0

예 그들은 호출 될 것입니다,하지만 나는 그 시점에 Object가 손상 될 수 있다고 의심했습니다. – user1289

답변

6

스택 풀기는 처음에 RAII가 발명 된 시퀀스 인 입니다. 그래서 가장 확실한 도구입니다.

특정 경우에 코드가 잘못 작동해야하는 이유가 없습니다. 유일한 문제는 some_callback이 실제로 some_function_which_may_throw_exception이 던져 넣을 때 유지되지 않는 Object의 내부 불변 변수에 의존하는 경우 발생할 수 있습니다. 그러나 이는 특정 코드의 문제이며 C++ 자체와 관련이 없습니다.

+0

감사합니다. 그래 네가 맞아. 그 이유는 내 부주의였다. 나는'AutoSomething auto (* this) '대신'AutoSomething (* this);'을 어떻게 쓰는지 궁금하다. – user1289

관련 문제