2016-07-01 14 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(); 
} 

Die Frage ist - wird der Zustand von Object in Ordnung sein, wenn der Destruktor von AutoSomething aufgerufen wird?Ist es sicher, RAII während des Abwickelns des Stapels zu verwenden?

+0

Was meinst du, der Staat ist in Ordnung? Es stimmt, dass der dtor von 'AutoSomething' aufgerufen wird und dann' Object :: some_callback() 'aufgerufen wird. – songyuanyao

+0

Wenn Sie eine Funktion in Ihrem Destruktor aufrufen, wird das Programm beendet. Normalerweise steuern Sie nicht, welche Callback-Funktionen das tun, deshalb würde ich vermeiden, Callbacks in einem Destruktor aufzurufen. – Galik

+0

Ja, sie werden angerufen, aber ich bezweifelte, dass das Objekt zu diesem Zeitpunkt beschädigt sein könnte. – user1289

Antwort

6

Stapelabwickeln ist die Situation, für die RAII in erster Linie erfunden wurde. Also ist es sicherlich das richtige Werkzeug dafür.

In Ihrem speziellen Fall gibt es keinen Grund, warum der Code sich falsch verhalten sollte. Das einzige Problem könnte entstehen, wenn some_callback auf eine interne Invariante von Object angewiesen ist, die nicht gepflegt wird, wenn some_function_which_may_throw_exception tatsächlich wirft, aber das würde ein Problem des bestimmten Codes und hat nichts mit C++ selbst zu tun.

+0

Danke. Ja, du hast recht. Der Grund war meine Nachlässigkeit, ich frage mich, wie ich "AutoSomething (* this)" anstelle von "AutoSomething auto (* this)" geschrieben habe. – user1289