PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme bei C++ mit new und delete



Sym
23-01-2005, 23:34
Hi,

ich habe folgendes Problem: Ich habe ein double-Array wie folgt angelegt:

if(_dim && _bandWidth) {
_matrix = new (double*)[2*_bandWidth+1];
for(unsigned int i=0; i<2*_bandWidth+1; i++) {
_matrix[i] = new double[_dim];
for(unsigned int j=0; j<_dim; j++)
_matrix[i][j] = 0.0;
}
}
Im Destruktor steht folgendes:

for(unsigned int i=0; i<2*_bandWidth+1; i++)
delete [] _matrix[i] ;
delete [] _matrix;
doch immer wenn ich das im Destruktor stehen habe, bekomme ich folgende Meldung(en):

*** malloc[4223]: Deallocation of a pointer not malloced: 0x20; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug
Woran kann das liegen? Woanders gebe ich den Speicher nicht frei.

quinte17
24-01-2005, 08:28
ich weiß zwar nicht wie die definition von _matrix aussieht, aber ich glaube dass diese zeile:


delete [] _matrix;


überflüssig ist, da es ziemlich sicher ein normal definierter pointer ist und du den nicht freigeben musst/kannst

greetz

Sym
24-01-2005, 08:53
ich weiß zwar nicht wie die definition von _matrix aussieht, aber ich glaube dass diese zeile:


delete [] _matrix;


überflüssig ist, da es ziemlich sicher ein normal definierter pointer ist und du den nicht freigeben musst/kannst

greetz
Hi,

erst einmal danke für Deine Antwort. Es ist so definiert:

double ** _matrix;
Ich denke, da braucht man das schon. Und selbst wenn ich die Zeile weglassen würde, kommen die Fehler.

wraith
24-01-2005, 08:58
Entferne erstmal die () Klammern in der zweiten Zeile um double*, die sind da falsch.
Ansonsten sieht es gut aus.
Machst du zwischen drin einen Fehler, also bekommst du auch die Meldung, wenn du nur Konstruktor und Destruktor aufrufst?

Sym
24-01-2005, 09:24
Entferne erstmal die () Klammern in der zweiten Zeile um double*, die sind da falsch.
Ansonsten sieht es gut aus.
Machst du zwischen drin einen Fehler, also bekommst du auch die Meldung, wenn du nur Konstruktor und Destruktor aufrufst?
Ok, die Klammern sind da weg. Wenn ich den Konstruktor aufrufe und anschließend mein Objekt zerstöre, kommt kein Fehler. Aber ich wüsste nicht, was da Probleme geben könnte. Ich verändere die Feltgröße nirgends. Schreibe lediglich Werte direkt in die Referenzen der matrix.

wraith
24-01-2005, 09:48
Wenn ich den Konstruktor aufrufe und anschließend mein Objekt zerstöre, kommt kein Fehler. Aber ich wüsste nicht, was da Probleme geben könnte. Ich verändere die Feltgröße nirgends. Schreibe lediglich Werte direkt in die Referenzen der matrix.
O.k. wenn der Fehler nicht mehr auftritt, wenn du nur Konstruktor und Destruktor aufrufst, dann grenzt das den Fehler schon mal ein.
Wahrscheinlich schreibst du über die Grenzen der Matrix hinaus, also prüfe nochmal deine Indices.
Oder du setzt irgendwo den matrix Zeiger unwissentlich auf einen anderen Wert.

Sym
25-01-2005, 14:21
Hallo,

nochmals danke. Ich habe den Fehler gefunden. Der Copy-Konstruktor war fehlerhaft. Jetzt funktioniert es wunderbar.