Array mit Elementen von Zeiger auf Heap . delete ??



  • Hallo Leute . Ich habe mal eine kurze Frage :
    Wir nehmen mal an ich habe ein Array

    Obj * pIntArray[max_Anzahl];
    

    Und ich befülle dieses Array mit meinen Objekten

    for (int i = 0 ; i < max_Anzahl ; i ++)
    {
      pIntArray[i] = new Obj;
    }
    

    Nun möchte ich alle diese Objekte vom Heap löschen .

    delete pIntArray ; // würde das erste Element aus einem Array auf dem Heap löschen ??
    
    delete pIntArray[] ; // löscht ein gesamtes Array auf dem Heap.
    
    for(int i = 0 ; i < max_Anzahl ; i ++)
    {
    delete pIntArray[i] ; // löscht das ite Element aus dem Heap auf das der Pointer im Array zeigt
    

    Also wäre der letzte Ansatz bei meinem Beispiel doch der richtige ?

    Mfg



  • #include <iostream>
    
    class Obj{public: Obj(){std::cout << "kons";} ~Obj(){std::cout << "dest";}};
    
    int main() 
    { 
    	Obj *objarray = new Obj[100]; //Rüft defaultkonstruktor auf für 100 Objekte 
    	delete[] objarray;
    }
    


  • Am besten nimmt man für sowas auto_ptr oder noch besser boost::ptr_container. Diese räumen automatisch den Speicher auf wenn man die Objekte aus der Liste löscht.
    Ansonsten muss man die ganze Liste durchlaufen und die Objekte einzeln löschen.

    Übrigens ist das kein Array aus Objekten, sondern ein Array aus Zeigern.
    Das würde schon am Anfang krachen.

    // Entweder:
    Object pArray[10];
    
    //Oder
    Object* pArray = new Object[10]
    

    Ein Container ist allerdings besser.
    Für noch mehr Performance gibt es auch boost::slist, aber das ist nicht so einfach zu verwenden.



  • Das ist schön , aber nicht die Antwort auf meine Frage .
    Du deklarierst dort ja ein komplettes Array auf dem Heap.
    Und objArray ist ein Zeiger auf das erste Element.
    deswegen musst du ja den delete[] Operator aufrufen .
    Es ging mir um ein Array welches Zeiger auf Objekte auf dem Heap enthällt .



  • Nicht gleich mit boost um dich werfen... std::vector<Obj> reicht vollkommen.



  • Obj * pIntArray[max_Anzahl];
    

    das ist doch ein Array aus Zeigern auf Obj oder liege ich da falsch ?



  • Ja, aber warum in einer Schleife alles einzeln anlegen wenn der Compiler das für dich erledigen kann per
    Object* pArray = new Object[10];
    ?

    edit:
    Der g++ kompiliert es, der VC++ nicht. So am Rande 🙂

    error C2057: expected constant expression
    error C2466: cannot allocate an array of constant size 0
    error C2133: 'pIntArray' : unknown size



  • Bacid90210 schrieb:

    Ich habe mal eine kurze Frage:
    Wir nehmen mal an ich habe ein Array

    Obj * pIntArray[max_Anzahl];
    

    Und ich befülle dieses Array mit meinen Objekten

    for (int i = 0 ; i < max_Anzahl ; i ++)
    {
      pIntArray[i] = new Obj;
    }
    

    Naja, ich würde eher sagen, Du befüllst das Array mit Adressen Deiner im Freispeicher erzeugten Objekte. Entweder warst Du jetzt absichtlich schlamping bei der Ausdrucksweise (zB aus Faulheit) oder Dir ist der feine Unterschied nicht klar. Letzteres könnte erklären, warum Du diese Frage stellst.

    Bacid90210 schrieb:

    Nun möchte ich alle diese Objekte vom Heap löschen .

    delete pIntArray ; // würde das erste Element aus einem Array auf dem Heap löschen ??
    

    Nein. pIntArray bezieht sich auf ein Array vom Typ T[N] mit T=Obj*. Der Ausdruck wird in diesem Kontext zum Zeiger auf das erste Element konvertiert. Ein Zeiger auf das erste Element ist vom Typ T*, also Obj** bei Dir. Das heißt, Du würdest versuchen, das Zeiger-Array per delete zu löschen. Das ist aber doppelt falsch. Erstens, hast Du dieses Array nicht im Freispeicher erzeugt und zweitens, hättest Du es per new Obj*[N] erzeugt, dann wäre delete immer noch falsch, weil Du hättest delete[] nehmen müssen.

    Bacid90210 schrieb:

    delete pIntArray[] ; // löscht ein gesamtes Array auf dem Heap.
    

    Das Array liegt gar nicht im Heap (Freispeicher), also darfst Du es auch nicht per delete löschen. Die Syntax ist hier auch sowieso falsch. Das [] kommt wenn überhaupt an das delete dran.

    Bacid90210 schrieb:

    for(int i = 0 ; i < max_Anzahl ; i ++)
    {
      delete pIntArray[i]; 
    }
    

    Also wäre der letzte Ansatz bei meinem Beispiel doch der richtige ?

    Ja.



  • Dankeschön , auf so eine Antwort habe ich gewartet .

    Das mit dem delete[] tut mir Leid . Ich wollte schnell machen und habe nicht aufgepasst .


Anmelden zum Antworten