Zeiger auf Array auf dem Heap nach inkrementieren löschen


  • Mod

    Nein. Die Möglichkeit gibt es nicht. Aber dies alles sollte gar nicht notwendig sein. Warum benutzt du so wilde Sachen, anstatt z.B. std::vector?



  • Okay. Werden die Vector Elemente auf dem Stack oder auf dem Heap angelegt???



  • Auf dem Heap. Auf dem Stack sind dynamische Arrays nur sehr bedingt möglich.


  • Mod

    goldenBoy schrieb:

    Okay. Werden die Vector Elemente auf dem Stack oder auf dem Heap angelegt???

    Gegenfrage: Wieso sollte das interessant sein? Es funktioniert eben einfach.



  • und es ist bei vector garantiert, dass die elemente hintereinander liegen. theoretisch könntest du also deine pointer spielereien trotzdem machen...

    scheint meint, dass du ein ganz großer 3 sterne programmierer bist 🙂



  • Noch so allgemein:
    Der Pointer, dem der Rückgabewert von new zugewiesen wurde, sollte nie vor der Verwendung von delete verändert werden. Wenn du nun, wie gesagt, inkrementieren möchtest, erstellst du eben einen zweiten Zeiger. Der Zweite dient als Iterator.



  • Indem man zwischen dem eigentlichen Array und dem Iterator dafür unterscheidet:

    Cat * const cat_array = new Cat[10];
    
    Cat * cat_iterator = cat_array;
    
    ++cat_iterator;
    ++cat_iterator;
    
    //...
    delete cat_array;
    

    Eigentlich ist das auch bei Standardlib-Containern gang und gäbe, daher verstehe ich den Aufschrei nicht so ganz.



  • Das ist für mich interessant, weil ich tausende von Objekten im Vector speichern will. Und vielleicht ist auf dem Stack der Speicher zu knapp.

    Also vector speichert von Haus aus alle Elemente auf dem Heap an. Und man kann den Speicher auch explizit mit dem Clean Befehl freigeben, richtig?

    Welche Vorteile hat man, wenn man den Vector (Vector pointer) direkt auf dem Heap anlegt?



  • EOutOfResources schrieb:

    Noch so allgemein:
    Der Pointer, dem der Rückgabewert von new zugewiesen wurde, sollte nie vor der Verwendung von delete verändert werden. Wenn du nun, wie gesagt, inkrementieren möchtest, erstellst du eben einen zweiten Zeiger. Der Zweite dient als Iterator.

    danke für den Tipp!



  • Welche Vorteile hat man, wenn man den Vector (Vector pointer) direkt auf dem Heap anlegt?

    Keine. Nur Nachteile.


  • Mod

    goldenBoy schrieb:

    Also vector speichert von Haus aus alle Elemente auf dem Heap an. Und man kann den Speicher auch explizit mit dem Clean Befehl freigeben, richtig?

    vector kennt kein clean, aber es gibt andere Befehle die ähnliches machen. Guck eben in einer Referenz nach. Der vector verwaltet seinen Speicher vollständig selber. Wenn du einen vector explizit dazu zwingen willst, seinen kompletten Speicher freizugeben (normalerweise keine gute Idee!), dann such mal nach Clear-and-minimize

    Welche Vorteile hat man, wenn man den Vector (Vector pointer) direkt auf dem Heap anlegt?

    Den vector selber auf dem Heap? Die gleichen Vorteile wie bei allen Heapvariablen: Keine nennenswerten, dafür ein paar Nachteile. Man sollte schon extrem gute Gründe dafür haben, z.B. ganz besondere Anforderungen an die Lebenszeit des Objekts.



  • Danke an alle für die Hilfe



  • Oder Multithreading.



  • Tachyon schrieb:

    Indem man zwischen dem eigentlichen Array und dem Iterator dafür unterscheidet:

    Cat * const cat_array = new Cat[10];
    
    Cat * cat_iterator = cat_array;
    
    ++cat_iterator;
    ++cat_iterator;
    
    //...
    delete cat_array;
    

    Eigentlich ist das auch bei Standardlib-Containern gang und gäbe, daher verstehe ich den Aufschrei nicht so ganz.

    Kurze Frage: Es müsste doch

    delete[] cat_array
    

    heißen oder nicht?

    Lg freeG

    EDIT:
    Was erhalte ich eigentlich zurück, wenn ich wie der TE einen Zeiger habe und dort den Indexoperator anwende?



  • fr33g schrieb:

    Es müsste doch

    delete[] cat_array
    

    heißen oder nicht?

    Ja.

    fr33g schrieb:

    Was erhalte ich eigentlich zurück, wenn ich wie der TE einen Zeiger habe und dort den Indexoperator anwende?

    Einen Zeiger auf n Elemente weiter (wie der + -Operator).

    EDIT: Natürlich + -Operator.



  • fr33g schrieb:

    Kurze Frage: Es müsste doch

    delete[] cat_array
    

    heißen oder nicht?

    Ja, absolut richtig.

    fr33g schrieb:

    Was erhalte ich eigentlich zurück, wenn ich wie der TE einen Zeiger habe und dort den Indexoperator anwende?

    a[3] ist äquivalent mit *(a+3) ist äquivalent mit 3[a] ist äquivalent mit *(3+a) .



  • Vielen Dank euch beiden, jetzt ist es mir wieder klar 🙂

    Lg freeG


Anmelden zum Antworten