Instanz wird erzeugt, ohne dass der Konstruktor aufgerufen wird



  • hmmm. erscheint mir nicht schlüssig. der zähler ist ja statisch und bleibt somit erhalten selbst wenn die instanz zerstört wird.
    außerdem dürfte dann auch nicht das herunterzählen funktionieren.



  • Puh! Zu schnell für mich.

    Folgendes könnte passieren:

    Der Konstruktor zählt hoch.
    Das Objekt kommt in den Container mit dem Copy-Konstruktor.
    Der Destruktor zählt runter, weil das Objekt ja nur lokal gültig ist und beim Verlassen der Methode zerstört wird, d.h. die Variable m_instanceCntr bleibt unverändert.

    Wird das Objekt im Container zerstört zählt der Destruktor nochmal runter.

    /edit/
    Am Quellcode verdeutlicht:

    void CGame::spawnAsteroids(void)
    {
            // drawarea ist eine instanz einer klasse, die für das rendern
            // verantwortlich ist
            // hier ist m_instanceCntr noch 0
        CAsteroid tempAsteroid(&DrawArea); 
            // nun ist m_instanceCntr 1
        m_lAsteorid.push_back(tempAsteroid);
            // für das Objekt im Container bleibt m_instanceCntr unverändert, 
            // da der Copy-Konstruktor wahrscheinlich m_instanceCntr nicht ändert
    
           // m_instanceCntr wir wieder auf 0 gesetzt, 
           // da tempAsteroid hier zerstört wird
           // und es somit zum Aufruf des Destruktors kommt
    }
    

    Irgendwann später im Quellcode wird auch das Objekt im Container m_lAsteorid zerstört, was zum Destruktoraufruf führt und dazu, dass m_instanceCntr runtergezählt und somti negativ wird.



  • OMG sowas steppt man im Debugger durch wenn man es wissen will, und wenn man aus welchem Grund auch immer keinen Debugger verwenden kann (DirectDraw Fullscreen oder was auch immer), dann verwendet man Debug Traces oder Logfiles (umständlicher, führt aber sicher schneller zu einem Ergebnis als hier Tagelang rumzudiskutieren).



  • hustbaer schrieb:

    OMG ...

    Na, das ist doch kein Grund das höchste "Metaobjekt" anzurufen. 😃

    Du hast natürlich Recht, der Debugger wäre die schnellste Methode gewesen. Wenn ich das richtig sehe, hat camper die Lösung auch schon nach ca. 3 Stunden ins Forum gestellt. Leider zeigte sich der "Patient" uneinsichtig, was bis zur Stunde anhält.

    t512 schrieb:

    hmmm. erscheint mir nicht schlüssig. ...



  • Iich würd sagen du haust mal nen Copy- ctor in dein code, welcher auch den instanzenzähler hochzählt.. bei der kopie in den containert bleibt der wert unverändert... wie schon erwähnt wurde...

    1. Erezugen (Zähler++)
    2. Kopie in den Container (passiert nicht mit zähler)
    3. zestörung nach kopie (Zähler--)

    -- objekt lebt

    4. obekt wird ausm container gelöscht (Zähler--)



  • ok, das erscheint mir jetzt schlüssig. ich habe wohl nicht gleich verstanden, was camper da gemeint hat.



  • jo, bau nen copy-ctor ein, und es funzt;) 😃


Anmelden zum Antworten