Destructoraufruf bei lokalen Objekten



  • Hallo Leute,

    habe kürzlich festgestellt, dass der Destructor eines Objektes !nicht! aufgerufen wird, wenn das Teil lokal instanziert ist. Ich war immer der Meinung das passiert automatisch, wenn das Objekt vom Stack gekickt wird. Das würde ja bedeuten: Wenn ich Wert auf nen Destructoraufruf lege, muss ich das Ding per new instanzieren! Find ich nicht sinnvoll! Mach ich was falsch, oder seh ich einfach den Grund für dieses Verhalten nicht? Hat da jemand ne Erkärung parat???

    Benutze gcc 2.95.4 unter FreeBSD. Ist das auch bei anderen Compilern/Versionen der Fall? - Hab jetzt grad keinen andern da, um das zu Testen 😞



  • Sepp Brannigan schrieb:

    habe kürzlich festgestellt, dass der Destructor eines Objektes !nicht! aufgerufen wird, wenn das Teil lokal instanziert ist. Ich war immer der Meinung das passiert automatisch, wenn das Objekt vom Stack gekickt wird. Das würde ja bedeuten: Wenn ich Wert auf nen Destructoraufruf lege, muss ich das Ding per new instanzieren! Find ich nicht sinnvoll! Mach ich was falsch, oder seh ich einfach den Grund für dieses Verhalten nicht? Hat da jemand ne Erkärung parat???

    Das muß irgendwas mit dem Compiler zu tun haben.

    Grundsätzlich wird nämlich bei Objekten auf dem Stack der Dtor aufgerufen, sobald der Programmfluß den aktuellen Block verläßt.

    Also so, wie Du es eigentlich als sinnvoll vermutet hast. Warum das in Deinem Fall nicht passiert ist... eigentlich dürfte es nicht der Fall sein. Vielleicht ein anderes Problem, z.B. eine Klassenhierarchie, wo die Dtoren nicht virtual sind? Und nicht der Dtor aufgerufen wurde, den Du vermutet hast? Oder das Objekt war static?



  • Hallo,
    die Klasse ist absoluter "Einzelkämpfer" also ganz ohne Hierarchie. Und static ist die Instanz auch nicht - da wärs logisch. Hab mir den Ablauf im Debugger angeschaut: Der macht einfach nichts!
    Das merkwürdige ist: Sobald ich das Teil per new instanziere - und dann natürlich auch explizit per delete lösche - funktioniert alles wie erwartet!



  • Dann zeig doch mal ein minimales Beispielprogramm, in dem das so ist.



  • Hab soeben den Fehler gefunden. Der Tipp mit dem minimalen Beispielprogramm war gut 😉

    #include <stdio.h>
    
    class Klasse {
      public:
        Klasse() {};
        ~Klasse() {
          printf("destructor\n");
        }
    }
    
    int main( int argc, char **argv )
    {
      Klasse instance;
      return 0;
    //  exit(0);   <=== Der Übeltäter!
    }
    

    War immer der Meinung exit() räumt auch schön auf ... tuts offensichtlich nicht! Da müsst ich dann wohl atexit() bemühen, was? 🙂

    Danke fürs Gedankenmachen!
    Brannigan



  • Sepp Brannigan schrieb:

    War immer der Meinung exit() räumt auch schön auf ...

    ne, exit() killt das programm - IIRC werden nur statische objekte zerstoert, lokale aber nicht.

    also: lass die finger von exit, terminate, abort, etc. - das ist alles boese.



  • Sepp Brannigan schrieb:

    Da müsst ich dann wohl atexit() bemühen, was?

    Nö. atexit ruft auch keine Destruktoren auf.



  • Ich weiss. Ich dachte dabei an eine Aufräumfunktion oder so die ich per atexit() registrieren würde. Aber wär ja Quatsch!


Anmelden zum Antworten