C-Unterstützung für „finally“-Blöcke und das RAII-Idiom
Entgegen der landläufigen Meinung unterstützt C keine „finally“-Blöcke. Stattdessen wird ein grundlegendes Konzept verwendet, das als RAII (Resource Acquisition Is Initialization) bekannt ist.
Das RAII-Idiom
RAII fasst die Idee zusammen, dass eine Ressource während des Objekts erworben werden sollte initialisiert und in seinem Destruktor freigegeben. Wenn ein Objekt den Gültigkeitsbereich verlässt, wird sein Destruktor automatisch aufgerufen, wodurch die Ressourcenbereinigung auch beim Vorliegen von Ausnahmen sichergestellt wird. Dadurch entfällt die Notwendigkeit expliziter „finally“-Blöcke.
Ein Beispiel ist unten dargestellt:
class lock { mutex& m_; public: lock(mutex& m) : m_(m) { m.acquire(); } ~lock() { m_.release(); } }; class foo { mutex mutex_; public: void bar() { lock scopeLock(mutex_); // Lock object foobar(); // May throw an exception // scopeLock will be destructed and release the mutex, regardless of an exception } };
Darüber hinaus vereinfacht RAII die Klassenverwaltung von Ressourcen. Wenn Mitgliedsobjekte Ressourcen verwalten, kann die besitzende Klasse die Verantwortung ihres Destruktors minimieren und sich darauf verlassen, dass die Destruktoren ihrer Mitgliedsobjekte Ressourcen freigeben.
RAII im Vergleich zur „using“-Anweisung von C#
Ähnlich wie RAII sorgt die „using“-Anweisung von C# für die deterministische Zerstörung von Ressourcen. Der Unterschied zu RAII besteht jedoch darin, dass die Ressourcenverwaltung auf alle Ressourcentypen, einschließlich Speicher, ausgeweitet wird. Im Gegensatz dazu geben „using“-Anweisungen in .NET deterministisch Ressourcen frei, mit Ausnahme des Speichers, der während der Garbage-Collection-Zyklen behandelt wird.
Das obige ist der detaillierte Inhalt vonVerfügt C über „finally'-Blöcke und wie schneidet RAII im Vergleich zur „using'-Anweisung von C# ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!