Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Fehler bei delete: Damage

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.01.2004, 19:42 Uhr
~Christoph Redl
Gast


Hallo!

Ich schreibe gerade eine C++ - Klasse, in die man dynamisch Objekte einhängen kann, und dann über Indizes wieder darauf zugreifen kann.
Dabei verwende ich ein dynamisch wachsendes Array von void-Pointern, da Objekte beliebiger Klassen eingehängt werden sollen.
Beim Einhängen will übergebe ich die Adresse des Objektes.

Funktioniert alles ganz gut, nur die Funktion, die das Array hin und wieder (immer dann, wenn es zu klein wird) vergrößern soll stürtzt ab:





C++:
void ObjectContainer::resize(){

    // Temporäres Array anlegen
    void** tmpObjects = new void*[this->currentSize];

    // Pointer in das temporäre Array kopieren
    for(dl = 1; dl <= currentSize; dl++){
        tmpObjects[dl] = objects[dl];
    }

    // Original-Array löschen (falls es bereits angelegt ist --> Ist beim Einhängen des 1. Objektes nicht der Fall)
    if(this->currentSize > 0){
        delete []objects;        // <-- FEHLER
    }

    // Original-Array neu anlegen (um 10 vergrößert, damit es wieder längere Zeit ausreicht)
    this->objects = new void*[this->currentSize + 10];

    // Temporäres Array wieder zurückkopieren
    for(dl = 1; dl <= this->currentSize; dl++){
        objects[dl] = tmpObjects[dl];
    }

    // Noch nicht belegte Indices im neuen Array auf NULL setzen
    for(dl = this->currentSize + 1; dl <= currentSize + 10; dl++){
        objects[dl] = NULL;
    }

    // Temporäres Array löschen
    delete []tmpObjects;

    // Neue Anzahl der Indices speichern
    this->currentSize += 10;
}





currentSize gibt an, wie viele Indices das aktuelle Feld hat. Die Einhängen-Funktion zählt in einer Instanz-Variablen mit, wie viele Objekte bereits eingehängt wurden und kann so feststellen, ob das Array vergrößert werden muss (also diese Funktion aufgerufen werden muss).


In der markieren Zeile stürtzt das Programm aber ab: "Debug Error! DAMAGE: after Normal block (#44) at 0x03611C0".

Das Array, das die Objekte speichert, ist als private Instanzvariable deklariert:

void** objects;

Und so will ich die Objekte einhängen:


C++:

int ObjectContainer::add(void* newObject){

    ...
    // Prüfen, ob das Array vergrößert werden muss
    ...
    objects[nextIndex] = newObject;
    return nextIndex++;    // Orgiginalwert zurückgeben, erst dann kommt ++

}




Was mache ich falsch?

Danke!

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.01.2004, 19:50 Uhr
(un)wissender
Niveauwart


Hm, du weißt, dass, wenn du das Array löscht, du die Pointer der Objekte verlierst?
Wenn du die nicht noch anders wo hast, produzierst du ein Memoryleak mit evtl. beachtlicher Größe.

Ich würde generell memcpy verwenden.

Die Frage ist auch, ob du objects schon initialisiert hast, bevor du es das erste Mal löscht, sieht nicht danach aus.
Enweder du setzt es zu Beginn auf null oder änderst dein Design.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.01.2004, 19:52 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


noch ein vorschlag...
nimm eine klasse aus der stl... die nimmt dir den kram ab...oder willst du das aus irgendwelchen gründen auf keinen fall machen?

Ach so und in c laufen felder von 0 bis N-1 und nicht von 1bis N
deine obige schleife ist also gar nicht gut...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 10.01.2004 um 19:55 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.01.2004, 19:59 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


der trick mit dem speichervergrössern geht überigens so...
1)ein temparray anlegen was um gewünschte anzahl der elemente grösser ist als das urprungsarray...
2)daten aus dem originalarray ins temparray kopieren
3)originalarray löschen
4)den zeiger des orignalarrys aufs temp-array zeigen lassen..

fertig...
wenn du ein mehrdimensionales array hast brauchst du dich auch nur im die erste dimension kümmern, weil du ja nur pointer hast brauchst du also nur diese kopieren das andere kann im speicher so erhalten bleiben...
das ist insbesonder dann praktisch wenn man ein array von pointern auf objekte einer klasse hat weil man dann nur die pointer kopiert und nicht gleich noch alle objekte...da wird die sache dann wesentlich performanter und man bekommt auch nicht so schnell speicherprobleme...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.01.2004, 20:08 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ums mal konkret zu machen...aber vorsicht nicht getestet einfach nur gepostet

C++:
void ObjectContainer::resize(int n){
void** tmpObjects = new void*[this->currentSize+n];
memcpy(tmpObjects,objects,currentSize*sizeof(void*));
//if(this->currentSize > 0) delete []objects;würd ich so nicht machen sondern einfach immer im konstrutkor schon mal ne reserve aufbauen...ist aber sicherlich geschmacksache
delete []objects;
objects = tmpObjects;
currentSize +=n;
}



Ach so sinnvoll ist es noch eine variable in der klasse zu haben die angibt wieviele objecte sich denn überhaupt im array befinden
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 10.01.2004 um 20:13 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: