komisches Problem: Assertion-Fehler von fremder Datei



  • ich arbeite zur Zeit an Font-Funktionen und einer Art Console für alle meine Projekte (OpenGL).
    Mein Aufbau ist auch recht simpel: ich arbeite mit ner verketteten Liste.
    Beim Aufruf der Funktion PrintText(char 😉 wir ein neues Element erzeugt und der String richtig umgewandelt und kopiert. Die Funktion ClearPrintList() löscht die Liste wieder. Die Funktion PrintOnScreen() schreibt dann alles auf den Screen.
    soweit auch einfach und ich habe die ganzen Funktionen auch explizit getestet und es ist fehler-frei (auch keine Zeiger-fehler). als ich das ganze aber in ein ogl-projekt einbinden wollte, gabs n komischen Fehler:
    Microsoft Visual C++ Debug Library
    Debug Assertion Failed!
    File: dbgdel.cpp
    Line: 47
    Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

    ich binde diese Datei nicht ein!
    wenn ich folgende Zeile kommentiere, dann funktionniert das prog (aber der Start-Zeiger aufs erste Element ist damit nicht gesetzt und somit wird auch nichts geschrieben):
    firstDebugPrint=newitem;
    ich schreib mal die Funktion PrintText hier rein. vieleicht mach ich ja n fehler irgendwo anders...

    //Font.h
    struct sDebugPrint
    {
    	char *text;
    	sDebugPrint *next;
    	sDebugPrint();
    	~sDebugPrint();
    };
    //...
    
    //Font.cpp
    #include Font.h
    sDebugPrint *firstDebugPrint=NULL;
    sDebugPrint *lastDebugPrint=NULL;
    
    void PrintText(const char* message, ...)
    {
    	char		string[256];
    	va_list		va;
    	if (message == NULL)
    		return;
    	va_start(va,message);
    	vsprintf(string,message,va);
    	va_end(va);
    
      	sDebugPrint *newitem;
    	newitem=new sDebugPrint;
    	newitem->text=new char[strlen(string)+1];
    	strcpy(newitem->text,string);
    	newitem->next=NULL;
    	sDebugPrint *tmp=NULL;
    
    	if(firstDebugPrint==NULL)
    	{
    		[b]firstDebugPrint=newitem;[/b]
    		//ohne diese Zeile wird kein Assertion-Fehler verursacht
    	}
    	if(lastDebugPrint!=NULL)
    	{
    		lastDebugPrint->next=newitem;
    	}
    
    	lastDebugPrint=newitem;
    }
    

    ich weiß wirklich bnicht mehr weiter. ich wäre sehr froh, wenn hier irgendjemand weiterhelfen könnte.
    heimschmiede



  • ich hab gerade etwas herausgefunden! man denkt tagelang über das Problem nach und wenn man es gerade in forum gestellt hat, dann sieht man, dass das problem an einer ganz anderen stelle liegt.
    es ist nicht die funktion PrintText, die Probleme bereitet. Die Funktion ClearPrintText() macht Stress! den grund dafür versth ich aber trotzdem nicht!
    die Funktion soll die ganze verkettete Liste wieder löschen.
    der fehler muss irgendwo bei den delete liegen. wenn ich die erste delete kommetiere, dann erhalte ich einen Stack Overflow! wenn ich die zweite kommentiere, dann läuft alles soweit korrekt, aber ich denke mal, dass mir trotzdem der RAM zugebombt wird, weil eben die alten Listenelemente nicht weg sind!

    void ClearPrintList()
    {
    	sDebugPrint *cur;
    	sDebugPrint *nxt;
    	cur=firstDebugPrint;
    	while(cur!=NULL)
    	{
    		nxt=cur->next;
    		delete cur->text; // (1)
    		delete cur;       // (2)
    		cur=nxt;
    	}
    	firstDebugPrint=NULL;
    	lastDebugPrint=NULL;
    }
    

    heimschmiede



  • delete [] cur->text;  // Du willst ein Array löschen !
    


  • ohh! das stimmt. kann sowas nicht einen syntax-fehler verursachen?
    aber der Fehler verschwindet trotzdem nicht!
    ich habe mal mit Haltepunkten versucht, die Daten zu überprüfen.
    meine haltepunkte sahen wie folgt aus:

    void ClearPrintList()
    {
    	sDebugPrint *cur;
    	sDebugPrint *nxt;
    	cur=firstDebugPrint;
    	int i=0; //.....................(1)
    	while(cur!=NULL)
    	{
    		i++; //................(2)
    		nxt=cur->next; //......(3)
    		delete [] cur->text; //(4)
    		delete cur; //.........(5)
    		cur=nxt; //............(6)
    	}
    	firstDebugPrint=NULL; //........(7)
    	lastDebugPrint=NULL; //.........(8)
    }
    

    wenn die Funktion aufgerufen wird, dann hält der Debugger bei
    1,2,3,4,5 ->ohne Fehler, dann sollte man aber denken, dass er auf 6 springen sollte!!! der nächste Halt folgt aber bei 1 !!!!!!!!! (ohne bei 7 oder 8 einmal gewesen zu sein und auch ohne die Funktion verlassen zu haben!!!!!!
    da entsteht auch der Fehler, weil er versucht ein Array zu löschen, welches gar nicht mehr existiert!
    also ich progge schon sehr lange, auch in unterschiedlichsten Sprachen, aber so einen Sprung habe ich noch nie gesehen! kann mir das einer erklären?? Spekulationen sind auch gern gesehen!
    heimschmiede



  • Ich hab den Fehler !!
    ich habe aus welchen Gründen auch immer einen Aufruf der Funktion ClearPrintList() in den Destructor der Struktur sDebugPrint geschrieben!
    ein Element der Liste wird gelöscht und da wird der Destruktor ausgeführt, der die Funktion erneut startet. so kam der Fehler.
    ich danke an alle, die sich die Mühe gemacht haben diesen Thread auch nur zu lesen....
    und danke an niemand, für den kleineren Fehler!
    heimschmiede


Anmelden zum Antworten