Arrays im Heap



  • Hallo,
    Ich würde gern wissen wollen, wie
    ich ein dreidimensionales Array im Heap
    anlege und den Speicher wieder freigebe.
    Mit eindimens. Arrays ist mir die Syntax klar,
    aber wo ist hier der Trick?
    Dank euch für's reinschaun!



  • Es gibt in C++ einfacherweise keine 'mehrdimensionalen Arrays'. Es gibt aber dafür ganz einfach Arrays von Arrays. Das läuft also entweder auch ein eindimensionales Feld der Größe n*m*o hinaus, in der Du die Indexberechnung selber übernimmst (so etwas lässt sich bequem in einer Klasse verstecken). Oder etwas wie

    T**** array;
    array = new T***[n];
    for (int i = 0; i < n; ++i) {
        array[i] = new T**[m];
        for (int j = 0; j < m; ++j) {
            array[i][j] = new T*[o];
            for (int k = 0; k < o; ++k) array[i][j][k] = new T;
        }
    }
    
    array[1][2][3][4] = 5;
    
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            for (int k = 0; k < o; ++k) delete array[i][j][k];
            delete [] array[i][j];
        }
        delete [] array[i];
    }
    delete [] array;
    

    Das ist ungetestet, fürchte ich und funktioniert auch nur dann, wenn das new korrekt implementiert ist.

    [ Dieser Beitrag wurde am 11.04.2003 um 11:57 Uhr von Daniel E. editiert. ]



  • Hallo,
    vielleicht hilft auch ein Blick in unsere gern übersehende FAQ-Sammlung:
    dynamische mehrdimensionale Arrays



  • "gern übersehende FAQ-Sammlung"
    ARGH!!!!



  • Servus!
    Am schnellsten gehts hiermit:

    int number = 10;
    T (*bla)[10][10] = new T[number][10][10];

    Die Größe der ersten Ebene kann ich immer selbst dynamisch bestimmen.
    Für alle tieferen Ebenen muss die Größe fix angegeben werden!

    über bla[<index>][<index>][<index>] direkt auf die einzelnen Arrayelemente
    zugreifen.

    Löschvorgang wie gehabt: delete []bla;

    Geht recht schnell! Hat nur einen wesentlichen Nachteil:
    Man kann nicht per Zeiger auf einzelne Ebenen zugreifen, um beispielsweise
    einen Pointer auf das Array ab Ebene 1 an eine Funktion zu übergeben.
    (Wie es ja z.B. bei Java problemlos möglich ist)
    Falls man sowas im Sinn hat, sollte man sich das Array selbst zusammenbauen:

    int number = 10;
    T ***bla = new T**[number];
    for(int count=0;count<number;count++)
    {
    bla[count]=new T*[number];
    for(int count2=0;count2<number;count2++)
    {
    bla[count][count2]=new T[number];
    }
    }

    Erzeugen und Löschen sind zwar etwas umständlich, aber man
    kann nun wenigstens per Pointer auf beliebige Arrayebenen zugreifen!

    Grüße,
    TS++



  • @<Duden>
    Danke. Also heißt es korrekterweise "übersehene", richtig?

    Es gibt Dinge die werde ich wohl nie lernen 😞



  • Original erstellt von HumeSikkins:
    **@<Duden>
    Danke. Also heißt es korrekterweise "übersehene", richtig?

    Es gibt Dinge die werde ich wohl nie lernen :(**

    genau! mach dir nix draus. 🙂


Anmelden zum Antworten