Memory Leaks



  • Das habe ich schon probiert.
    Ich habe im Destruktor Clear Keywordlist aufgerufen.
    Der Quellcode:

    void CSyntaxColorizer::ClearKeywordList()
    {
    	SKeyword* pTemp = m_pskKeyword;
    
    	while(m_pskKeyword != NULL)
    	{
    		*(m_pTableZero + m_pskKeyword->keyword[0]) = SKIP;
    		if(_stricmp(m_pskKeyword->keyword,"rem") == 0)
    			*(m_pTableTwo + '\n') = SKIP;
    		pTemp = m_pskKeyword->pNext;
    		delete m_pskKeyword->keyword;
    		delete m_pskKeyword;
    		m_pskKeyword = pTemp;
    	}
    }
    

    Bei der Programmausführung wird der Debugger mit einer Fehlermeldung:
    "Unbehandelte Ausnahme" unerbrochen und springt die MFC interne Datei free.c auf die Zeile: HeapFree(_crtheap, 0, pBlock); 😞



  • array new und scalares delete gehen nicht gut zusammen, auch wenn das hier sicher nicht das problem ist. Im übrigen könnte man beides sparen, wenn CString benutzt würde.

    Paule 0 schrieb:

    Bei der Programmausführung wird der Debugger mit einer Fehlermeldung:
    "Unbehandelte Ausnahme" unerbrochen und springt die MFC interne Datei free.c auf die Zeile: HeapFree(_crtheap, 0, pBlock); 😞

    benutz den callstack um den aufrufer (und die parameter beim aufruf) festzustellen.



  • Achja, nochwas: Hat es einen Grund, daß du die verkettete Liste selber implementierst? Ich würde dir dafür eher std::list oder std::set (oder die MFC-Versionen davon) empfehlen.



  • Die Keywordlist enthält meine selbsterstellten Schlüsselwörter.
    Ich weiß nicht wie ich das anders lösen könnte. 😕



  • ich würde std::map empfehlen



  • class SKeyWord
    {
      //...
      char* keyword;
      bool operator<(const SKeyWord& other)
      {return strcmp(keyword,other.keyword)<0;}
      //oder besser gleich:
    
      std::string keyword;
      bool operator<(const SKeyWord& other)
      {return keyword<other.keyword;}
    };
    
    class CSyntaxColorizer
    {
      std::set<SKeyWord> m_KeyWords;
      //...
    };
    
    //Im Quelltext:
    m_KeyWords.insert(newKWD);//einfügen
    m_KeyWords.erase(newKWD); //löschen
    //...
    


  • Entschuldige, dass ich mich jetzt twas blöd anstelle, aber wo soll ich das genau reinschreiben.
    Muß ich eine neue Klasse SKeyWord erstellen?
    Danke!



  • #include <map>

    und anstelle deiner eigenen Liste benutz du die std::map



  • Nein, du mußt deine vorhandene SKeyWord-Klasse entsprechend anpassen (für sets/maps benötigst du einen Vergleichsoperator - und eine vordefinierte String-Klasse ist einfacher zu handhaben als char*).



  • beschäftige dich algemein mit associativen standard-containern - dann wird vieles klarer - und deine addKey() methode u.ä. kannst du dann auf 0 zeilen eindampfen 😉

    anonsten kannst du nat. auch versuchen den fehler zu finden, ich kann ihn nicht entdecken (abgesehen vom delete[] auf ->keyword und das führt bei vc++ häufig nicht zu abstürzen), allerdings schaue ich es mir auch nicht besonders intensiv an


Anmelden zum Antworten