Ausnahmen: Freigeben von Objekten in den Ausnahmen
In diesem Artikel wird die Anforderung und die Methode Freigeben von Objekten, wenn eine Ausnahme auftritt.Folgende Themen werden behandelt:
Die Ausnahme behandeln lokal
Ausnahmen ausgelöst werden, wenn Objekte zerstört wurden
Ausnahmen, die vom Framework oder von der Anwendung ausgelöst werden, verursachen normalen Ablaufsteuerung.Deshalb ist es sehr wichtig, nahes Objekte zu verfolgen, damit sie ordnungsgemäß freizugeben, können jedoch eine Ausnahme ausgelöst wird.
Es gibt zwei primäre Möglichkeiten, um dies zu tun.
Behandeln von Ausnahmen mit der lokalen try und catch Schlüsselwörter, zerstören dann alle Objekte mit einer Anweisung.
Zerstören Sie jedes Objekt im catch-Block, bevor Sie die Ausnahme (außerhalb des Blocks für weitere Behandlung auslösen.
Diese beiden Ansätze werden unten als Projektmappen problematischen dem folgenden Beispiel veranschaulicht:
void SomeFunc() // Problematic code
{
CPerson* myPerson = new CPerson;
// Do something that might throw an exception.
myPerson->SomeFunc();
// Now destroy the object before exiting.
// If SomeFunc above throws an exception this code will
// not be reached and myPerson will not be deleted.
delete myPerson;
}
Wie oben geschrieben wird myPerson nicht gelöscht, wenn eine Ausnahme durch SomeFunc ausgelöst wird.Führen Sie sprünge direkt zum nächsten äußeren Ausnahmehandler, die Beendigung der normalen Funktion und umgehend von Code, der das Objekt gelöscht wird.Der Zeiger auf das Objekt den Gültigkeitsbereich verlässt, wenn die Ausnahme für die Funktion verlässt, und der Speicher, der vom Objekt belegt wird, wird nicht wiederhergestellt, solange das Programm ausgeführt wird.Dies ist ein Speicherverlust; erkannt würden sie mithilfe der diagnose Arbeitsspeicher verwendet wurde.
Die Ausnahme behandeln lokal
Das try/catch Paradigma stellt ein defensives Programmiertechniken zur Vermeidung von Speicherverlusten und die Garantie dafür bereit, dass die Objekte gelöscht werden, wenn Ausnahmen auftreten.Beispielsweise könnte das Beispiel, das zuvor in diesem Artikel beschrieben wurde umgeschrieben werden wie folgt:
void SomeFunc()
{
CPerson* myPerson = new CPerson;
try
{
// Do something that might throw an exception.
myPerson->SomeFunc();
}
catch( CException* e )
{
// Handle the exception locally
e->Delete();
}
// Now destroy the object before exiting.
delete myPerson;
}
Dieses neue Beispiel richtet einen Ausnahmehandler die Ausnahme abgefangen und sie lokal zu behandeln.Die und beendet dann die Funktion normalerweise zerstört das Objekt.Der wichtiger Aspekt dieses Beispiels besteht darin, dass ein Kontext, in dem die Ausnahme abzufangen mit den try/catch Blöcke eingerichtet wurde.Ohne lokale Ausnahme Skinframes würde die Funktion nie wissen, dass eine Ausnahme ausgelöst wurde, war und nicht die Möglichkeit haben, normalerweise zu beenden und das Objekt zu zerstören.
Ausnahmen ausgelöst werden, wenn Objekte zerstört wurden
Eine andere Möglichkeit, Ausnahmen zu behandeln ist, sie an den nächsten äußeren Kontext zur Ausnahmebehandlung weiterzuleiten.In Ihrem catch-Block können Sie entweder die Bereinigung der lokal zugeordneten Objekte ausführen und die Ausnahme an dann zur weiteren Verarbeitung auslösen.
Die auslösende Funktion muss möglicherweise Heap Objekte freigeben.Wenn die Funktion immer das Heap Objekt freigibt, bevor sie im Normalfall gibt, sollte die Funktion der Heap Objekt auch freigeben, bevor die Ausnahme auslöst.Wenn die Funktion nicht in der Regel das Objekt freigibt, bevor sie im Normalfall gibt, dann müssen Sie entscheiden, von Fall zu Fall Heap ob das Objekt freigegeben werden soll.
Das folgende Beispiel veranschaulicht, wie lokale zugeordnete Objekte bereinigt werden können: oben
void SomeFunc()
{
CPerson* myPerson = new CPerson;
try
{
// Do something that might throw an exception.
myPerson->SomeFunc();
}
catch( CException* e )
{
e->ReportError();
// Destroy the object before passing exception on.
delete myPerson;
// Throw the exception to the next handler.
throw;
}
// On normal exits, destroy the object.
delete myPerson;
}
Der Mechanismus zur Ausnahme gibt automatisch Frame Objekte frei. Der Destruktor des Frameobjekts wird auch aufgerufen.
Wenn Sie Funktionen aufrufen, die Ausnahmen auslösen können, können Sie try/catch Blöcke verwenden, um sicherzustellen, dass Sie die Ausnahmen abfangen und haben die Möglichkeit, alle Objekte zu zerstören, die Sie erstellt haben.Insbesondere sollten Sie beachten, dass viele MFC-Funktionen Ausnahmen auslösen können.
Weitere Informationen finden Sie unter Ausnahmen: Ausnahmen abfangen und Löschen.