Seltsamer Fehler (c++)

Ich weiß die Überschrift ist gut ;)

Ich verstehe das nun wirklich nicht, ich schreibe gerade etwas etwas größeres und habe nun in der Methode einer Templateklasse folgenden Fehler:
Code:
template<class Typ>
void World<Typ>::PairCreaturesNumber(unsigned int Father,unsigned int Mother)
{
	  unsigned char *FCode=m_pCreature[Father].GetTripletts();
	  unsigned char *MCode=m_pCreature[Mother].GetTripletts();
	  unsigned char *NewCode;
	  int Size=m_pCreature[Father].GetNumberOfTripletts();
	  printf("FEHLER DANACH\n");
	  int *p1;
	  p1=new int[3];
	  printf("FEHLER DANACH\n");
	  unsigned int BreakPoint=Size/2;
                       ///........... usw usw usw usw
Die printf hab ich benutzt um zu sehen wo der Fehler ist.
Seht euch nur mal dieses p1=new int[3] an, da schließt er das Programm auf einmal und macht das gleiche als hätte man throw da benutzt wo kein try block steht. Ich habe auch schon versucht mit malloc zu reservieren, jedoch mit dem gleichem Resultat. Ich arbeite mit Dev-Cpp.
Würde mich über antworten freuen, weil das versteh ich wirklich nicht.
 
Mit diesen Code-Fragmenten kann man auf die Schnelle nichts sagen. Zeig uns mal deine Methoden bzw. liefern die ihren Wert richtig zurück?!

Hast du schon debuggt?
Wahrscheinlich nicht, oder?

Compiler- oder Linkerwarnungen vorhanden?

throw benutzt,[...] wo kein try block steht
Zumindest im Borland-Builder, wird automatisch ein try-catch-Block generiert (sogar 2), das muss unter Dev-Cpp wohl auch der Fall sein

Wie genau schaut die Fehlermeldung aus, eine Exception oder? Was steht da drin?- Wahrscheinlich Speicherverletzung, oder? Probiere mal int *p1 = NULL; aus und kommentiere die Speicherreservierung aus. Immer noch dasselbe Problem?

Wo liegt der Fehler (die Exception die "gethrowed" wird) genau, nach der Speicherreservierung für p1 oder? An und für sich ist diese aber korrekt. Denk daran ihn später wieder freizugeben (ich weiß, gehört jetzt nicht hier her; das vergiss nur ich sehr oft)

Anderen Compiler probieren. Nimm VS oder BCB bzw. wohl eher TC, hab keine Erfahrung mit Dev-Cpp

"Unwichtiges" auskommentieren.

Wenn alles nichts nützt, Quelltext uploaden.

int Size=m_pCreature[Father].GetNumberOfTripletts();
Hier würde ich, wenn ich du wäre eher mit properties arbeiten, aber das auch nur so nebenbei.
mfg. shadowrunner
 
Debuggen will ich noch machen.

Gesamter Quelltext bringt glaub ich nichts, weil wie soll bei <<new int>> ein Fehler in Abhängigkeit des restlichen Quelltextes aufkommen ( habe new nicht überladen ) ?

Und ja der Fehler liegt GENAU da, nämlich bei new int.

Na ja, ich werd mich gleich nochmal dransetzen, totzdem danke.
 
Wenn ein Fehler mitten in einer normalen, legalen Speicherreservierung geschmissen wird, kann das nach meinen Erfahrungen exakt zwei Ursachen haben:

a) Der verfügbare Speicherplatz ist schlicht aufgebraucht. (Vielleicht ist ein logischer Fehler irgendwo ganz anders, der zu unsinnigen Speicherreservierungen ohne notwendige Freigaben führt?)

b) Die Speicherverwaltung wurde zerschossen, weil Zeiger auf allozierte Datenblöcke nicht als Zeiger auf allozierte Datenblöcke, sondern als Zeiger auf Arrays benutzt wurden. Das ganze gepaart mit Fehlern in der Programmlogik, so daß TATSÄCHLICH auf angenommene, aber nicht wirklich vorhandene Folgedaten geschrieben wurde und dabei tatsächlich die Speicherverwaltung von Folgeblöcken der Speicherverwaltung zerschreddert wurde.

Ersteres kriegt man sehr leicht raus, indem man die geschmissene Exception näher anschaut. Letzteres sollte zu einer unhandled Exception führen, die irgendwas aussagt, was keinen tieferen Sinn zu haben scheint.
 
Hm, scheint so als hätte er meinen Speicher vorhin tatsächlich aufebraucht.....
Ich hab das Programm jedenfalls nun so einigermaßen zum laufen gebracht (PC neu gestartet, new überladen und es ging seltsamerweise). Aber nun hat er ein Problem mit delete[] und schmiert dann immer ab, was ich jedoch auf den Dekonstruktor schiebe (denke ich).
 
Zurück
Oben