Klassen Objekte werden in Arrayinitialisierung zerstört



  • Hallo

    zusammen. Ich habe eine kurze Frage und zwar erzeuge ich ein Array (3D) in dem ich Klassen Objekte abspeichere. Aufbau ist simple und wie folgt:

    using lookUpTable = std::vector<std::vector<std::vector<MixtureFraction> > >;
    

    Der Code sieht wie folgt aus; relativ einfach:

    lookUpTable lookUpTables;
    
        Info<< "Start\n" << endl;
        {
            const scalarField defects = properties.defects();
            const scalarField sDRs = properties.sDRs();
            const unsigned int Zpoints = properties.mfPoints();
    
            scalar delta = 1./Zpoints;
    
            //- Adiabatic flamelet (always available)
            {
                Info<< "    ... for adiabatic condition\n\n";
    
                lookUpTables.push_back(vector<vector<MixtureFraction> >());
    
                forAll(sDRs, rate)
                {
                    Info<< "        Create flamelets for scalar dissipation rate "
                        << sDRs[rate] << " Hz\n";
    
                    lookUpTables[0].push_back(vector<MixtureFraction>());
    
                    for(unsigned int i=0; i < Zpoints+1; i++)
                    {
                        scalar zPointValue = i*delta;
    
                        lookUpTables[0][rate].push_back
                        (
                            MixtureFraction
                            (
                                chemistry,
                                thermo,
                                transport,
                                properties,
                                zPointValue,
                                scalar(0)
                            )
                        );
    
                    //- Z points
                    }
    
                //- sDR points
                }
                Info<< "\n";
    
            //- adiabatic condition
            }
        }
    

    Ich erstelle hier meine adiabatisches Array. Im Test habe ich nur eine sRD, sodass mein Array folgende Größe hat:

    lookUpTable | 1 | 1 | 40

    Am Ende habe ich 40 Objekte des Typs mixutreFraction in dem Vectorarray abgelegt. Darauf kann ich auch zugreifen. Allerdings frage ich mich wieso folgendes beim Aufruf des Programms ausgegeben wird:

    ... for adiabatic condition
    
            Create flamelets for scalar dissipation rate 1e-06 Hz
    Constructor MixtureFraction
    
    Species: O2
    saved: 1
    saved outside: 1
    saved outside: 1
    Species O2: 1
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.95
    saved outside: 0.95
    saved outside: 0.95
    Species O2: 0.95
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.9
    saved outside: 0.9
    saved outside: 0.9
    Species O2: 0.9
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.85
    saved outside: 0.85
    saved outside: 0.85
    Species O2: 0.85
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.8
    saved outside: 0.8
    saved outside: 0.8
    Species O2: 0.8
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.75
    saved outside: 0.75
    saved outside: 0.75
    Species O2: 0.75
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.7
    saved outside: 0.7
    saved outside: 0.7
    Species O2: 0.7
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.65
    saved outside: 0.65
    saved outside: 0.65
    Species O2: 0.65
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.6
    saved outside: 0.6
    saved outside: 0.6
    Species O2: 0.6
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.55
    saved outside: 0.55
    saved outside: 0.55
    Species O2: 0.55
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.5
    saved outside: 0.5
    saved outside: 0.5
    Species O2: 0.5
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.45
    saved outside: 0.45
    saved outside: 0.45
    Species O2: 0.45
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.4
    saved outside: 0.4
    saved outside: 0.4
    Species O2: 0.4
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.35
    saved outside: 0.35
    saved outside: 0.35
    Species O2: 0.35
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.3
    saved outside: 0.3
    saved outside: 0.3
    Species O2: 0.3
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.25
    saved outside: 0.25
    saved outside: 0.25
    Species O2: 0.25
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.2
    saved outside: 0.2
    saved outside: 0.2
    Species O2: 0.2
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.15
    saved outside: 0.15
    saved outside: 0.15
    Species O2: 0.15
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.1
    saved outside: 0.1
    saved outside: 0.1
    Species O2: 0.1
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0.05
    saved outside: 0.05
    saved outside: 0.05
    Species O2: 0.05
    Destruct MixtureFraction
    
    Constructor MixtureFraction
    
    Species: O2
    saved: 0
    saved outside: 0
    saved outside: 0
    Species O2: 0
    Destruct MixtureFraction
    

    Ich war der Meinung, dass der Destruktor erst aufgerufen wird, nachdem die Gültigkeit von lookUpTable erloschen ist. Kann mir jemand erklären wieso ich so oft der Destruktor so oft aufgerufen wird? Komm da gerade nicht drauf. Vllt mach ich auch einen Fehler beim Aufbau des Arrays 😕

    Grüße Tobi



  • Das dürfte durch das mehrmalige Vergrößern des Vektors kommen. Wenn du ständig push_back benutzt ist irgendwann der vom std::vector reservierte Speicher voll, er muss neuen reservieren, die Daten rüber kopieren und die alten Daten löschen. Du kannst ja vor der Schleife mit reserve entsprechend viel Platz reservieren. Dann sollten die Ausgaben vom Destructor verschwunden sein.



  • Hi Sebi,

    vielen Dank für die Rückmeldung. So hab ich das noch gar nicht gesehen (:
    Heißt also in der ersten Schleife, erstelle ich ein neues Objekt im Vector lookUpTables. Dann hat der Vector eine bestimme Größe, beim erneuten push.back() vergrößere ich den Vektor wieder. Der alte reservierte Speicher für lookUpTables ist jetzt zu klein, somit wird neuer angefordert und dann die Prozedur die du erwähnt hast durchgeführt (kopieren und dann wieder zerstören).

    Ich werde heute mal mit reserve arbeiten (danke für den Hinweis). Soweit ich es aber von deiner Nachricht rauslese, ist das was ich erhalte nicht weiter problematisch.



  • Zusätzlich werden bei jedem push_back ein Objekt in den vector kopiert und das Ursprungsobjekt gelöscht. Wenn Du im Copy-Ctor auch noch eine Ausgabe machtest, würdest Du das Erzeugen der Kopie auch noch sehen.



  • Shor-ty schrieb:

    Soweit ich es aber von deiner Nachricht rauslese, ist das was ich erhalte nicht weiter problematisch.

    Nein das ist völlig normal. Der vector kann ja schließlich nicht hellsehen und wissen wie häufig du push_back nutzen möchtest. Jedes mal wenn der vector zu klein ist wird dieser auf das 1,5-2,0 fache seiner momentanen Größe vergrößert. Das sieht man auch in der Ausgabe da Anfangs nach fast jedem push_back Objekte zerstört werden, später aber immer seltener.



  • Hallo zusammen,

    das mit dem CConst schau ich mir heute Abend mal noch an. Danke Sebi für die Klärung. Wusste gar nicht das std::vector ca. 1.5 - 2 fache reserviert. Meine Ausgabe ähnelt ja sehr stark der, die in dem Beispiel auf der reserve Seite zu finden ist.

    Wiedermal was dazugelernt. Danke euch.
    Grüße Tobi


Anmelden zum Antworten