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?Безопасно ли использовать RAII при размотке штабеля?

+0

Что значит состояние в порядке? Это правда, что будет вызван dtor 'AutoSomething', а затем вызывается' Object :: some_callback() '. – songyuanyao

+0

Если вы вызываете функцию в своем деструкторе, которая бросает вашу программу, она прекратится. Как правило, вы не контролируете, какие функции обратного вызова делают так, я бы избегал вызова calback в деструкторе. – Galik

+0

Да, они будут вызваны, но я сомневался, что объект может быть поврежден в то время. – user1289

ответ

6

Разбивка стеков - это местоположение для, для которого RAII был изобретен в первую очередь. Так что это, безусловно, правильный инструмент для этого.

В вашем конкретном случае нет причин, по которым код должен вести себя неправильно. Единственная проблема может возникнуть, если some_callback полагается на внутренний инвариант Object, который не поддерживается, когда фактически набрасывается some_function_which_may_throw_exception, но это будет проблемой конкретного кода и не имеет ничего общего с самим C++.

+0

Спасибо. Да ты прав. Причина была в моей небрежности, мне интересно, как я написал 'AutoSomething (* this);' вместо 'AutoSomething auto (* this)'. – user1289