[gelöst] delete wirft Fehler

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
hundvdf
Beiträge: 28
Registriert: 03.10.2002, 13:48
Kontaktdaten:

[gelöst] delete wirft Fehler

Beitrag von hundvdf »

Hallo,
ich hab für meinen kleinen Raytracer jetzt noch einen Datei-Loader geschrieben. Der besteht aus einer Hauptklasse Loader und dann für jeden Dateityp nochmals aus einer abgeleiteten Klasse z.B. LoaderOBJ.

Ich habe jetzt in meiner Hauptklasse folgende LoadFile-Methode:

Code: Alles auswählen

void Loader::LoadFile(string filename,vector<Objekt> &objekte,MaterialManager &matman) {
    vector<string> split;
	strsplit(filename,'.',split);

	Loader *fileloader=NULL;

	if(streq(split[split.size()-1],"ac")) {
		fileloader=new LoaderAC();
	}
	else if(streq(split[split.size()-1],"obj")) {
		fileloader=new LoaderOBJ();
	}

	if(fileloader==NULL)
		throw new Exception(NULL,__FILE__,__LINE__,"Fehler beim Laden des Modells","Dateiformat wird nicht unterstützt!");

	fileloader->LoadFile(filename,objekte,matman);
	delete fileloader;
}
Alles soweit gut, die Datei wird auch richtig eingelesen, allerdings wirft er bei delete fileloader; einen Fehler: "free(): invalid next size (fast)", lösche ich die Zeile, kommt der Fehler nicht und das Programm läuft ganz normal weiter. Ich habe jetzt gerade allerdings keine Idee, an was dieser Fehler liegen könnte, denn der Fehler kommt auch bei folgendem reduziertem Code:

Code: Alles auswählen

void Loader::LoadFile(string filename,vector<Objekt> &objekte,MaterialManager &matman) {
	Loader *fileloader=NULL;
	fileloader=new LoaderOBJ();
	if(fileloader==NULL)
		throw new Exception(NULL,__FILE__,__LINE__,"Fehler beim Laden des Modells","Dateiformat wird nicht unterstützt!");
	delete fileloader;
}
Der Destruktor hat jeweils noch virtual mit dabei, aber trotzdem scheint es an der abgeleiteten Klasse zu liegen, da es mit fileloader=new Loader(); keinen Fehler gibt. Als Attribute habe ich in den Unterklassen lediglich einige vectoren, keine Pointer, in der Hauptklasse gar keine Attribute.

Könnt ihr mir dabei bitte helfen?

Vielen Dank
hundvdf
Zuletzt geändert von hundvdf am 28.08.2011, 17:53, insgesamt 1-mal geändert.
hundvdf
Beiträge: 28
Registriert: 03.10.2002, 13:48
Kontaktdaten:

Re: delete wirft Fehler

Beitrag von hundvdf »

PS: folgendes wirft auch einen Fehler:

Code: Alles auswählen

void Loader::LoadFile(string filename,vector<Objekt> &objekte,MaterialManager &matman) {
	LoaderOBJ *fileloader=new LoaderOBJ();
	delete fileloader;
}
Benutzeravatar
FlorianB82
Beiträge: 70
Registriert: 18.11.2010, 05:08
Wohnort: Darmstadt
Kontaktdaten:

Re: delete wirft Fehler

Beitrag von FlorianB82 »

hm, ich sehe keine fehler in dem von dir geposteten code. mein verdacht ist, dass du an ganz anderer stelle im programm dir den heap versaust, bsp. durch pufferüberläufe oder ähnliches. das mal näher gecheckt?

bleibt das verhalten gleich, egal, ob du im release oder debug modus bist?
hundvdf
Beiträge: 28
Registriert: 03.10.2002, 13:48
Kontaktdaten:

Re: delete wirft Fehler

Beitrag von hundvdf »

Okay, sorry, Denkfehler von mir, habs schon gelöst.

Folgendes war das Problem: ich hab in der Loader.cpp nur den public-Bereich der LoaderOBJ und LoaderAC-Klasse eingebunden (weil es ansonsten Fehler wegen Doppeldeklaration mit verschiedenen Hilfs-structs und -enums gegeben hat) und das hat dem wohl nicht so gepasst. Habs jetzt abgeändert, so dass die komplette Klasse auch in die Loader.cpp eingebunden wird mit allen Attributen, jetzt funktioniert es.

Grüße und Danke
hundvdf
Benutzeravatar
FlorianB82
Beiträge: 70
Registriert: 18.11.2010, 05:08
Wohnort: Darmstadt
Kontaktdaten:

Re: [gelöst] delete wirft Fehler

Beitrag von FlorianB82 »

hehe, okeh, dann ists klar: die instanz einer klasse enthält alle member variablen, auch natürlich die privaten. fütterst du den compiler da mit widersprüchlichen informationen, dann gibt es auch schnell murks mit der allokation des speichers für die instanzen...
Antworten