# corrupted double-linked list : 0x....



## maniacquaker (30. Januar 2007)

Hallo,
das ist der fehler den ich bekomme, wenn ich zum 5. mal (exakt und immer)
mein array erweitere. komischerweise funktioniert der auskommentierte code,
verursacht meiner meinung nach aber ein speicherleak.

die funktion die ich meine heisst enlarge_array()  (weit unten)

naja auf jedenfall weiss ich nicht warum das so ein fehler sein soll:


```
#ifndef _headers_
	#define _headers_
	#include <time.h>
	#include <string.h>
	#include <iostream>
#endif

#ifndef _mitarbeiter_
	#define _mitarbeiter_

	#include "mitarbeiter.h"
#endif

#ifndef _mhandler_
	#define _mhandler_
	#include "mhandler.h"
#endif

#define min_mitarbeiter 3;

using namespace std;

mhandler::mhandler(){
	m=NULL;
	max_mitarbeiter=min_mitarbeiter;
	cur_mitarbeiter=0;
}


void mhandler::show(){
	unsigned int personalnummer=0;
	unsigned int i=0;
	bool found=false;
	string name;
	cout<<"Geben sie Bitte die Personalnummer ein: ";
	cin>>personalnummer;
	
	for(i;i<max_mitarbeiter;i++){
		if(m[i].IsPersonalnummer(personalnummer) && m[i].GetPin()!=0){
			found=true;
			break;
		}	
	}
	
	if(found==true){
	
		cout<<"Personalnummer: "<<personalnummer<<endl;
		m[i].GetName(name);
		cout<<"Name : "<<name<<endl;
		m[i].GetVname(name);
		cout<<"Vorname : "<<name<<endl;
	}
	
	else
		cout<<endl<<endl<<"Personalnummer nicht vorhanden!"<<endl<<endl;
}

void mhandler::addmitarbeiter(){
	unsigned int tmp;
	string name;
	
	if(cur_mitarbeiter==max_mitarbeiter-1){
		enlarge_array();
	}
		
	cout<<"bitte geben sie den namen an: ";
	cin>>name;
	m[cur_mitarbeiter].SetName(name);
	
	cout<<"bitte geben sie den vornamen an: ";
	cin>>name;
	m[cur_mitarbeiter].SetVname(name);
	do{
		cout<<"bitte geben sie die PIN an: ";
		cin>>tmp;
    	cout<<endl;
	}while(tmp==0);
	m[cur_mitarbeiter].SetPin(tmp);
	cout<<"Der Benutzer wird uebernommen...danke"<<endl;	
	cout<<endl<<"Die Personalnummer lautet: "<<m[cur_mitarbeiter].GetPersonalnummer()<<endl<<endl;
	cur_mitarbeiter++;
}

unsigned int mhandler::auth(){
	unsigned int personalnummer;
	unsigned int pin;
	unsigned int i=0;
	
	cout<<"Bitte Authentifizieren sie sich mit ihrer Personalnummer: ";
	cin>>personalnummer;
	cout<<endl<<"Bitte geben sie ihre PIN ein: ";
	cin>>pin;
	
	for(i;i<max_mitarbeiter;i++){
		if(pin == m[i].GetPin() && personalnummer== m[i].GetPersonalnummer())
			return personalnummer;
	}
	return 0;
}

void mhandler::enlarge_array(){								//BUGGY ! nachfragen! (mhandler tmp)
	
	mitarbeiter* tmp;
	
	tmp = new mitarbeiter[(max_mitarbeiter+1)];
	if(!tmp)
		cout<<"Keinen Speicher bekommen :( "<<endl;
	memcpy(tmp,m, (max_mitarbeiter)*sizeof(mitarbeiter));
	
	
	delete [] m;
	m=tmp;
	max_mitarbeiter++;
	/*
	mitarbeiter* tmp2=m;					
	
	m=tmp;
	tmp=tmp2;                     
									
	tmp2=NULL;
	max_mitarbeiter+=1;
	*/
}

mhandler::~mhandler(){
	delete [] m;
}
```


danke im voraus


----------



## jokey2 (30. Januar 2007)

1. Warum nimmst Du nicht gleich einen std::vector? Dann brauchst Du Dich um sowas nicht mehr zu kümmern.
2. Der Code scheint soweit zu stimmen. Allerdings legst Du in deiner enlarge-Funktion ein neues Array mit leeren Mitarbeitern an. Vielleicht kracht es dann beim Zugriff auf einen solchen leeren Eintrag. Du solltest also erst die Einträge aus dem alten Array in das neue kopieren, bevor Du das alte array löschst.


----------



## maniacquaker (30. Januar 2007)

ich kopiere doch erst mit memcpy und weise dann erst tmp m zu. vorher lösche ich m aber das ist ja auch nicht schlimm, da ja jetzt tmp auf das neue array zeigt.

das ganze ist für die schule und wir sollten es so lernen... für den umgang mit pointern und dem heap... ist auch nötig wie man an dem bug sieht


----------



## jokey2 (30. Januar 2007)

> ch kopiere doch erst mit memcpy und weise dann erst tmp m zu.


Sorry, das hatte ich glatt übersehen.
Sonst sieht der Code für mich eigentlich ok aus. Vielleicht solltest Du die Funktion verlassen, wenn das new fehlgeschlagen ist und dann auch 'false' zurückgeben (Rückgabetyp ändern).


----------



## maniacquaker (30. Januar 2007)

ja muss ich noch implementieren aber das new schlägt auf keinen fall fehl, dann hätte ich ja die ausgabe...  es ist wirklich erst nach dem 5. mal alloziieren. wenn ich jeweils 2 neue felder hole ist es nach dem 10. mal etc... das muss doch irgend etwas bedeuten...


----------



## jokey2 (30. Januar 2007)

Was für ein Typ ist denn 'mitarbeiter' und wo genau kommt die Fehlermeldung (In welcher Zeile)? Das mit der double-linked list irritiert mich schon etwas, da Du ja nur ein einfaches Array allozierst. Wo ist also die liste? Ist sie ein Member von mitarbeiter?


----------



## maniacquaker (30. Januar 2007)

der fehler passiert beim destroy (irgendein template, dass beim delete ausgeführt wird)       die klasse mitarbeiter sieht wie folgt aus: 

http://nopaste.php-q.net/272272


----------



## maniacquaker (30. Januar 2007)

übrigens steht da: *** glibc detected *** double free or corruption  (fasttop) : 0x...


die adresse schau ich mal nach liegt aber glaube ich im array bereich


----------

