vector<*object> aus dem Speicher löschen=>Speicherverletzung



  • Nexus hat dir das Problem schon gezeigt...



  • EOutOfResources schrieb:

    Nexus hat dir das Problem schon gezeigt...

    Auf Zeiger verzichten?
    Wie soll das gehen? Wie kann ich dynamisch den vector befüllen und entleeren mit ant Elementen, ohne auf new/delete zurückzugreifen?



  • Glutamat schrieb:

    EOutOfResources schrieb:

    Nexus hat dir das Problem schon gezeigt...

    Auf Zeiger verzichten?
    Wie soll das gehen? Wie kann ich dynamisch den vector befüllen und entleeren mit ant Elementen, ohne auf new/delete zurückzugreifen?

    statt
    vec.push_back(new ant(1));
    einfach
    vec.push_back(ant(1));
    schreiben?



  • Glutamat schrieb:

    Auf Zeiger verzichten?

    Nein, lies nochmals meinen Post.

    Wobei auf Zeiger und manuelle Speicherverwaltung verzichten sowieso eine gute Idee ist.



  • Falls du (Glutamat) es noch nicht gewusst hast: Ein std::vector mit seinem Standard-Allokator bezieht seinen Speicher auch von Heap (also mit new und delete ).



  • Falls du (Glutamat) es noch nicht gewusst hast: Ein std::vector mit seinem Standard-Allokator bezieht seinen Speicher auch von Heap (also mit new und delete).

    vAnts.push_back(ant(0));
    

    OK, wie funktioniert das nun im Detail? Eine Instanz einer Klasse wird erstellt mit ant(0). vector reserviert Speicher am Heap und macht eine 1:1 Kopie meiner Instanz. Richtig?



  • Nexus schrieb:

    Glutamat schrieb:

    Auf Zeiger verzichten?

    Nein, lies nochmals meinen Post.

    Wobei auf Zeiger und manuelle Speicherverwaltung verzichten sowieso eine gute Idee ist.

    Was meinst du damit? Das mit dem nicht initialisierten i in der for Schleife? Schon erledigt, das wars nicht.



  • Glutamat schrieb:

    OK, wie funktioniert das nun im Detail? Eine Instanz einer Klasse wird erstellt mit ant(0). vector reserviert Speicher am Heap und macht eine 1:1 Kopie meiner Instanz. Richtig?

    Ja, kommt hin. Wobei der Compiler eventuell(?) das Ganze noch soweit optimieren kann, daß der vector<> erst den Speicher reserviert und dann deine Instanz dort direkt erstellt.

    Edit: Und was ein großes Problem sein könnte, ist der Cast des Arrays in einen Doppelzeiger - so weit geht die Verwandschaft zwischen Zeigern und Array nicht, daß du dort etwas sinnvolles erwarten kannst.



  • Glutamat schrieb:

    EOutOfResources schrieb:

    Nexus hat dir das Problem schon gezeigt...

    Auf Zeiger verzichten?
    Wie soll das gehen? Wie kann ich dynamisch den vector befüllen und entleeren mit ant Elementen, ohne auf new/delete zurückzugreifen?

    oder machs mit einem pointer container, boost hat ptr_vector (oder so ähnlich)
    der löscht die objekte automatisch. oder nimm std::vector< std::shared_ptr<Ant> >



  • Wie sind denn ant und food deklariert? Sind da evtl. die großen 3 notwendig und implementiert?



  • Skym0sh0 schrieb:

    oder machs mit einem pointer container, boost hat ptr_vector (oder so ähnlich)
    der löscht die objekte automatisch. oder nimm std::vector< std::shared_ptr<Ant> >

    Nein, nimm wenn möglich Objekte. Die zusätzliche Indirektion ist normalerweise unnötig. Und der Overhead für Shared-Ownership erst recht...

    ptr_vector<T> kann man nehmen, falls man besitzende Zeiger braucht (z.B. nicht- bzw. teuer kopierbare oder polymorphe Objekte). vector<shared_ptr<T>> ist angebracht, falls die Objekte noch irgendwo ausserhalb referenziert werden, wo ebenfalls ein Besitzanspruch vorhanden ist. Das kommt aber eher selten vor...


Anmelden zum Antworten