Delete im Destruktor liefert Error
-
Hallo!
der VS 2003 liefert folgenden Fehler gegen Ende des Programms, als der Destruktor versucht dynamischen Array Speicher mit delete [] freizugeben. Das Freigeben von dynamischen Speicher für eine Klasse klappt problemlos.
Fehlermeldung: Debug Error! Damage after normal block .....was noch wissenswert ist:
send_frame und rcvd_frame sind struct Variablen.
ein Element davon ist eben dieses
uint8* data; //wobei: typedef signed char uint8hier der Code:
//Ctor: when a Segmenter is called, his buffers has to be allocated immediately Segmenter::Segmenter() : length(0), seg_number(0), seg_count(0), retries(0) { cout << "Konstruktor Segmenter" << std::endl; send_frame.data = new uint8[DATA_LEN];//<--------------------klappt rcvd_frame.data = new uint8[DATA_LEN];//<--------------------klappt //send_frame.data = (uint8*)malloc(sizeof(uint8)*DATA_LEN); //rcvd_frame.data = (uint8*)malloc(sizeof(uint8)*DATA_LEN); p_crc = new Crc16_MC;//<--------------------------------klappt assert(p_crc); } //when a Segmenter object "dies", his memory's got to be free Segmenter::~Segmenter() { cout << "Destruktor Segmenter" << std::endl; //free(send_frame.data); //free(rcvd_frame.data); delete [] send_frame.data;//<-------------------------------Error delete [] rcvd_frame.data;//<-------------------------------Error delete p_crc;//<--------------------------------------------klappt }
-
Ich würde ja darauf tippen, daß du beim Zugriff auf die beiden data-Elemente den erlaubten Index überschritten hast (zulässig sind 0 bis DATA_LEN-1). Eine andere Möglichkeit wäre eine Verletzung der "Rule of Three" - der implizit angelegte Copy-Ctor oder Zuweisungsoperator führen eine flache Kopie durch, so daß dein Speicher effektiv mehrmals freigegeben wird.
-
wenn das struct von send_frame und rcvd_frame deiner Kontrolle unterliegt dann bau die Kontrolle ueber den allokierten Speicher am Besten dort ein (auch structs koennen Ctor udn Dtor haben).
Ansonsten sieht mir das eigentlich nicht so falsch aus. Kriegst du den Fehler beim Kompilieren von Segmenter oder beim Kompilieren oder Ausfuerhen des Programms? (falls letzteres: wie sieht das Programm aus, bzw. die wesentlichen Zeilen?)
-
Arghhhh!!!
Ja, ich habe den Bereich überschritten.
Wegen der abschließenden '\0', die ich data hinzufüge.
Nun habe ich einfach so allokiert und schon gehts:send_frame.data = new uint8[DATA_LEN+1]; rcvd_frame.data = new uint8[DATA_LEN+1];Vielen Dank ihr habt mir einige Studnen Suche erspart.