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