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 |