Fehler beim Füllen von ListView
-
Hi!
Weiß jemand, woran es liegen könnte, dass ich beim Füllen eines ListViews mit LVITEMs durch ListView_InsertItem(), nach ca. 3 Items (mal mehr, mal weniger) eine std::bad_alloc Exception bekomme?
Gruß veryxRV
EDIT: Das LVITEM bekommt natürlich auch einen Text zugeordnet. Dieser Text ist die Ausgabe einer Funktion. Mir ist aufgefallen, dass die o.g. Exception nur dann eintritt, wenn der Name eine bestimmte Länge an Zeichen hat.
Sorry, aber der Code ist etwas zu verzweigt um ihn zu posten. Wäre gut, wenn mir auch vorerst so jemand helfen könnte.
-
veryxRV schrieb:
Hi!
Weiß jemand, woran es liegen könnte, dass ich beim Füllen eines ListViews mit LVITEMs durch ListView_InsertItem(), nach ca. 3 Items (mal mehr, mal weniger) eine std::bad_alloc Exception bekomme?
Ja, weil du einen Fehler gemacht hast.
-
Danke, noch jemand einen konstruktiven Vorschlag?
-
Ich kan auch nur wiederholen: Du hast einen Fehler gemacht. Vermutlich überschreibst Du Speicher.
Es ist reichlich vermessen anzunehmen, dass man irgendwas sagen könnte ohne den Code zu sehen.Ich habe eine Kristallkugel, aber die steht zu Hause auf der Fensterbank...

-
Na das mit dem Speicher gibt mir zumindest einen kleinen Ansatz, danke

Übrigens tritt der Fehler nur auf, wenn die lpszText Variable des LVITEM >= 23 Zeichen ist.
EDIT: Da ich jetzt einige Code Zeilen ausschließen konnte, hier doch mal ein Code Beispiel:
LVITEM lvi; ZeroMemory(&lvi, sizeof(LVITEM)); //lvi.cchTextMax = strlen(cj.GetFilename()+1); // <<< alterFehler lvi.mask = LVIF_TEXT; lvi.pszText = cj.GetFilename();// << Jetzt hier FehlerAn der markierten Stelle tritt der Fehler auf. Wahrscheinlich bekommt er Probleme, wenn er die dort bestimmte Speichermenge reservieren will.
-
Ich habe gerade gelesen, dass dieser Parameter in diesem Fall gar nicht benötigt wird. Habe oben mal die Stelle geändert, an der nun der Fehler auftritt.
GELÖST: Der Fehler war ein ganz blöder, aber nicht so leicht zu finden. In einer anderen Funktion stand folgendes:
char * cFilename; strTemp = fHandler.CutPathToFile(strTemp); cFilename = new char[sizeof(strTemp.c_str())]; // sizeof dummerweise mit strlen verwechselt, das hat den Crash verursacht sprintf(cFilename, "%s", strTemp.c_str());
-
veryxRV schrieb:
char * cFilename; strTemp = fHandler.CutPathToFile(strTemp); cFilename = new char[sizeof(strTemp.c_str())]; // sizeof dummerweise mit strlen verwechselt, das hat den Crash verursacht sprintf(cFilename, "%s", strTemp.c_str());Warum bemühst Du sprintf um Daten zu kopieren.
Ansonsten kannst Du auch strdup verwenden um das zu machen, was Du hier tust...