(erledigt) [C++] Kein delete [] bei Exception

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

(erledigt) [C++] Kein delete [] bei Exception

Beitrag von Krishty »

Hi,

Ich habe folgende Programmstruktur:

Code: Alles auswählen

int main() {
    try {
        SubFunction();
        return 0;
    } catch(...) {
        return -1;
    };
}

void SubFunction() {
    int * Array = new int[16];
    CriticalFunction(Array);
    delete [] Array;
}

void CriticalFunction(int * Array) {
    if(…)
        throw "FEHLER";
}
Unter bestimmten Umständen tritt ein Fehler auf und throw "FEHLER"; schmeißt mich in den catch-Block der main() zurück. Soweit, so beabsichtigt. Das Problem ist nur: Danach wird mir ein Speicherleck angezeigt, weil das in SubFunction() allokierte Array nicht mehr freigegeben wurde.

Irre ich mich, oder sollte dem nicht so sein? delete [] müsste doch im Fall einer Exception automatisch aufgerufen werden … die Operatoren new [] und delete [] sind global überladen, das dürfte aber eigentlich nichts ausmachen – oder?
Zuletzt geändert von Krishty am 08.06.2009, 18:26, insgesamt 1-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [C++] Kein delete [] bei Exception

Beitrag von Aramis »

delete [] müsste doch im Fall einer Exception automatisch aufgerufen werden
Wieso das denn? Im Rahmen des Stack-Unwindings auf der Suche nach einem Exception-Handler mit passender Signatur werden die Destruktoren aller lokal erzeugten Objekte aufgerufen, in umgekehrter Allokationsreihenfolge. Aber es wird kein weiterer normaler Programmcode ausgeführt, wie hier das delete[]. int* ist ein POD, hat also einen leeren Destruktor.

Genau das ist der Grund, warum es boost::scoped_ptr bzw. boost::scoped_array gibt :-)
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] Kein delete [] bei Exception

Beitrag von Krishty »

Krass, wie fundamental ich mich da wieder geirrt habe … new und new [] werden tatsächlich völlig ignoriert … ich hatte dauernd im Hinterkopf, dass während des Stack-Unwindings die passenden deletes aufgerufen würden :shock:

Ich finde im Netz zwar auch hunderte Artikel darüber, dass new Ausnahmen werfen kann, aber keinen einzigen darüber, wie sich dynamischer Speicher bei Ausnahmen verhält …

Dann benutze ich eben einen vector statt dem guten alten Array – danke für die Aufklärung :)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten