problem mit delete
-
Hi ich habe ein Problem beim löschen eines mit new angelegten Arrays:
Ich habe eine Struct:
typedef struct ImageDataRec { int rowSpan; int sizeX; int sizeY; unsigned char *data; } ImageDataRec;
In einer Funktion passiert dann folgendes:
data.data = new unsigned char[data.rowSpan * data.sizeY]; // Anderer Code for(i = 0; i < (data.rowSpan * data.sizeY); i++) delete[i] data.data;
data.rowSpan und data.sizeY bekommen ihre Werte aus einer jpg Datei, die Werte stimmen auch da die Datei korrekt geladen wird, allerdings stürzt mein Programm mit einem Speicherfehler ("Damaga after Normal Block") ab wenn ich am ende der Funktion den belegten Speicher unter data.data wieder freigeben will, die Werte von data.rowSpan und data.sizeY werden aber nach dem resavieren des Speichers nicht mehr verändert, wo liegt also der Fehler?
Ich hab auch schon versucht den Speicher mittels
delete [] data.data;
freizugeben, was allerdings den selben Fehler nach sich zieht.
Ich bin ratlos, normalerweise müssten doch beide Arten funktionieren oder?
-
ups ich hab was vergessen:
Man kann sichs zwar denken aber in der Funktion ist data eine Instanz von ImageDataRec
Wollt ich nur noch gesagt haben.
-
Hi!
Du brauchst bzw. darfst hier keine Schleife einsetzen.
Ersetze mal
for(i = 0; i < (data.rowSpan * data.sizeY); i++)
delete[i] data.data;durch
delete[] data.data;
das sollte gehen ?!
delete[] gibt den gesammten speicher frei. Du musst also nicht die Bytes einzeln löschen.
unsigned char * t = new unsigned char[1024];
delete t;
-
Original erstellt von Knuddlbaer:
unsigned char * t = new unsigned char[1024];
delete t;Tippfehler:
unsigned char * t = new unsigned char[1024];
delete [] t;wäre richtig
-
Original erstellt von Shade Of Mine:
**Tippfehler:unsigned char * t = new unsigned char[1024];
delete [] t;wäre richtig**
ich denke nicht, ich mache es auch so, und ich glaube, beide machen genau das Gleiche
-
Merksatz:
Jedes new hat sein delete und jedes new[] sein delete[]!delete gibt ein element frei
delete[] gibt ein array freipassend dazu:
new belegt platz für ein element
new[] belegt platz für ein array
-
ich denke nicht
Schade
ich mache es auch so
Dann machst du's falsch.
und ich glaube, beide machen genau das Gleiche
Dann vertrittst du hier zweifelsfrei einen Irrglaube.
Ein delete (ohne die []) auf Speicher der mit new[] angefordert wurde resultiert in undefiniertem Verhalten (siehe: 5.3.5p2). Dieses undefinierte Verhalten kann sich auf vielfältige Weise ausdrücken. Es kann sogar alles so laufen wie man es sich wünscht.
-
Original erstellt von HumeSikkins:
[quote]ich mache es auch so
Dann machst du's falsch.
[/QB][/QUOTE]
stimmt
ich hae nachgeguckt, man sollte delete[] benutzen. Aber ich bin sicher, ich hab's bei irgendeinem blöden Autor als "delete" gelesen.
Macht nix, dafür seid Ihr da, oder??Grüße
-
Bekomme ich irgendwelche Probleme/Nachteile, wenn ich einfach nie new & delete und immer new[] (mit der Dimension 1) und delete[] verwende?
-
Original erstellt von Daniel E.:
Bekomme ich irgendwelche Probleme/Nachteile, wenn ich einfach nie new & delete und immer new[] (mit der Dimension 1) und delete[] verwende?erst wenn du selbst new überlädst
AFIK
op new benutzt die operator new funktion
und op delete die operator delete funktion
und mit den ist sowas möglichint main() { void * p = operator new( 100 ); //allociert 100 bytes operator delete( p ); // da operator delete von mir nicht verlang das ich ihn die größe angeben // schliesse ich draus das operator new irgend wo die größe abspeichert }
wenn man ein eigenen allocator schreibt und new pro klasse überläd dann kann man diese overhead beseitigen
ps. sicher auf den gebiet bin ich nicht und habe selbt noch fragen, aber macht erstmal mein posting nieder
[ Dieser Beitrag wurde am 24.04.2003 um 00:34 Uhr von Dimah editiert. ]
-
Original erstellt von Daniel E.:
Bekomme ich irgendwelche Probleme/Nachteile, wenn ich einfach nie new & delete und immer new[] (mit der Dimension 1) und delete[] verwende?hast probleme, konstruktorargumente zu übergeben und vermutlich isses auch leicht lahmer.
-
Original erstellt von Shade Of Mine:
**Merksatz:
Jedes new hat sein delete und jedes new[] sein delete[]!delete gibt ein element frei
delete[] gibt ein array freipassend dazu:
new belegt platz für ein element
new[] belegt platz für ein array**Oh man, da will man ein Beispiel geben wie es richtig ist und macht alles falsch was man falsch machen kann O *pfeif*
-
volkard: Jeah, das Konstruktorargumentenargument ein gut :).
Dimah: Über das Überladen hatte ich nachgedacht, den Gedanken aber wegen »das macht doch eh niemand« wieder verworfen. Außerdem überlade ich -- wenn schon -- new[] gleich mit ;).