Speicher aufgebraucht



  • Hallo,
    bisher habe ich lediglich Grundlagen in C++ gelernt. Nun bin ich an meinem ersten eigenen größeren Programm und habe Probleme mit dem Speicher:

    Eine Ausnahme (erste Chance) bei 0x003c8c07 in PA_deltaPsi.exe: 0xC00000FD: Stack overflow.
    Unbehandelte Ausnahme bei 0x003c8c07 in PA_deltaPsi.exe: 0xC00000FD: Stack overflow.
    

    Ich benutze einige große arrays (double / complex<double> mit bis zu 2000 Werten).
    Wie kann ich auf einfachste Weise Speicher des heaps verwenden? (das dürfte ja mein Problem lösen!?)

    // array definieren / anlegen:
    complex<double> *matrixa;
    matrixa = new complex<double>[2000];
    // array belegen:
    matrix[xyz] = a[xyz]*b[xyz];
    // Speicher freigeben / array wieder löschen
    delete[] matrixa;
    

    Bin ich so auf dem richtigen Weg?
    Definition korrekt?
    Benutztung des arrays, als ob ich "complex<double> matrixa[2000];" geschrieben hätte? Also ohne Berücksichtigung auf pointer oder Adressen irgendwie?
    Muss ich mit delete das array wieder löschen?

    Danke.



  • I'm your friend & std::vector is your friend...



  • std::vector<complex<double>> matrixa(2000);
    

    ...das war alles?
    Und später kann ich es benutzen, in dem ich einfach wie gewohnt z.B.:
    matrixa[i] = ....
    schreibe?
    Freigeben muss man da auch nichts mehr?



  • Genau.



  • useheap schrieb:

    std::vector<complex<double>> matrixa(2000);
    

    ...das war alles?
    Und später kann ich es benutzen, in dem ich einfach wie gewohnt z.B.:
    matrixa[i] = ....
    schreibe?
    Freigeben muss man da auch nichts mehr?

    That's right dude!

    Du fuegst einfach Elemente in den vector ein, indem du:

    std::vector<std::complex<double> > matrixa;
    matrixa.push_back(std::complex(4.2, 3.2));
    matrixa.push_back(std::complex(2.3, 1.1));
    

    Der vector vergroessert sich automatisch, wenn er merkt, dass er kein Platz hat und gibt den Speicher automatisch wieder frei.

    Wenn du aber von vornherein weisst, dass der vector mind./max. 2000 Objekte enthalten wird, kannst du den Speicher reservieren: (Performanzvorteil)

    std::vector<std::complex<double> > matrixa(2000);
    // oder
    matrixa.reserve(2000);
    

    Du sagst danke, ich sag bitte!



  • vector,...easy! schrieb:

    Wenn du aber von vornherein weisst, dass der vector mind./max. 2000 Objekte enthalten wird, kannst du den Speicher reservieren: (Performanzvorteil)

    std::vector<std::complex<double> > matrixa(2000);
    // oder
    matrixa.reserve(2000);
    

    Das ist nicht das Gleiche.
    Speicher wird in beiden Fällen angefordert (capacity()==2000), im ersten Beispiel wird jedoch die Größe des Vectors ebenfalls auf 2000 gesetzt, daher wäre matrixa.resize(2000); äquivalent.



  • Sorry, irgendwie check ichs nicht ganz:

    [...]
    using namespace std;
    [...]
    //complex<double> fit1[2001];   hatte ich vorher...
    std::vector<complex<double>> fit1(2001);
    

    Fehlermeldungen:
    'vector': Ist kein Element von 'std'
    'vector': nichtdeklarierter Bezeichner
    'std::complex<double>': Ungültige Verwendung dieses Typs als Ausdruck
    "fit1": Bezeichner wurde nicht gefunden.
    und später, wo ich fit1 benutze:
    'fit1': nichtdeklarierter Bezeichner

    Bei zweidimensionalen arrays...
    std::vector<complex<double>> bsp(100)(100);
    ???



  • Gib das using namespace weg.



  • probier mal #include <vector>


  • Mod

    Hast du #include<vector> vergessen?

    Bei zweidimensionalen Strukturen nimmst du einen vector mit einem vector drin oder besser mit einem std::array. Die Initialisierung läuft dann auch ein bisschen anders, guck dir mal die Konstruktoren des vectors an, was so alles möglich ist.



  • Warum gibts eigentlich noch keinen std::vector mit fixer Größe (aber dennoch Heap-Allokation)?



  • 314159265358979 schrieb:

    Warum gibts eigentlich noch keinen std::vector mit fixer Größe (aber dennoch Heap-Allokation)?

    Verwirr den Neuling nicht mit deiner unnötigen Frage.
    Erstell einen neuen Thread.



  • Geht ja auch so:

    std::unique_ptr<std::array<foo, 256>> my_static_vector(new std::array<foo, 256>());
    

  • Mod

    314159265358979 schrieb:

    Warum gibts eigentlich noch keinen std::vector mit fixer Größe (aber dennoch Heap-Allokation)?

    Zu welchem Zweck? Welchen Vorteil sollte das bieten gegenüber einem stdd::array, das auf dem free store angelegt wird?



  • Bei std::array ist die Größe eine Compilezeit-Konstante.



  • Danke euch allen, ja, das hab ich natürlich verpennt zu includen.
    Ich nehme an, am besten schreib ich sämtliche arrays nach dem Schema um, sodass ich keine weiteren Speicherprobleme bekomme..!?
    Zu dem zweidimensionalen komme ich erst später, aber ich denke das könnte ich dann vollends alleine hinkriegen.
    Danke nochmals


  • Mod

    useheap schrieb:

    Danke euch allen, ja, das hab ich natürlich verpennt zu includen.
    Ich nehme an, am besten schreib ich sämtliche arrays nach dem Schema um, sodass ich keine weiteren Speicherprobleme bekomme..!?
    Zu dem zweidimensionalen komme ich erst später, aber ich denke das könnte ich dann vollends alleine hinkriegen.
    Danke nochmals

    Der typische Stolperstein bei vector in vector, den vermutlich jeder macht, ist zu vergessen, dass man den inneren vectoren erst einmal Elemente zuweisen muss, bevor diese Elemente benutzen kann. Klingt zwar ganz einleuchtend, aber irgendwie kommt die Frage hier dauernd.



  • 314159265358979 schrieb:

    Bei std::array ist die Größe eine Compilezeit-Konstante.

    Stimmt, hab das grad durcheinandergeworfen.



  • 314159265358979 schrieb:

    Warum gibts eigentlich noch keinen std::vector mit fixer Größe (aber dennoch Heap-Allokation)?

    Ein vector hat genau dann eine fixe Größe, wenn du sie nicht veränderst.



  • Und du hast nicht verstanden was ich überhaupt will. Danke trotzdem für den sinnlosen Beitrag.


Log in to reply