Heapfehler
-
Hey,
Ich habe einen heapfehler beim erstellen einiger Textdokumente.
MCD_STR ist ein spezieller String von CMarkup, wie CString.class CDienst{ private: static const int Anz_Dienste = 14; MCD_STR FileNames[Anz_Dienste]; public: CDienst(); void create_Files(); }; CDienst::CDienst(){ FileNames[0] = L"We_Pl_f"; FileNames[1] = L"We_Pl_g"; FileNames[2] = L"Solar_f"; FileNames[3] = L"Luftt_f"; FileNames[4] = L"Luftd_g"; FileNames[5] = L"Windp_f"; FileNames[6] = L"Windp_g"; FileNames[7] = L"Nebel_m"; FileNames[8] = L"BoFro_m"; FileNames[9] = L"BlEis_m"; FileNames[10] = L"Boeen_m"; FileNames[11] = L"StReg_m"; FileNames[12] = L"Hitze_m"; FileNames[13] = L"Kaelt_m"; } void CDienst::create_Files(){ for ( int i = 0; i < Anz_Dienste; i++ ){ if(Dienste[i] == true){ std::fstream File(FileNames[i] + ".dat", std::ios::app|std::ios::out|std::ios::in); if(File.fail()){ Error_Datei(); return; } Save_ID(FileNames[i]); File.close(); } } } }In der Zeile von fstream kann ich immer noch halten, nur wenn ich auf weiter drücke kommt dann:
Haltepunkt ausgelöst. Kann auf Beschädigung des Heaps zurückzuführen sein.Wäre über jede Hilfe dankbar.
-
Wie sieht denn der Operator+ von MCD_STR aus? Oder gibt es nur einen operator const char*?
Dann gibt es nämlich beiFileNames[i] + ".dat"Probleme->besser den Umweg über einen std::string gehen.
-
ok, ich habe das ganze noch einmal mit CString (denke, dass wird ungefähr das selbe sein wie std::string) versucht und die Datei(von VC++) hat sich verändert, in der der Fehler auftritt, aber der Fehler leider immer noch der selbe.
Ich habe es außerdem noch mal versucht, wenn ich .dat gleich bei den Namensdefinitionen aufrufe, somit steht jetzt nur noch da
std::fstream File(FileNames[i], std::ios::app|std::ios::out|std::ios::in);
-
MCD_STR kann, so sagt mir google, entweder std::string, std::wstring oder CString sein (je nach Projekttyp). Welcher es bei dir ist, wäre spannend zu wissen.
So oder so stößt es mir aber komisch auf, dass du die Strings hier
CDienst::CDienst(){ FileNames[0] = L"We_Pl_f"; ...mit wide strings initialisiert, aber hier
FileNames[i] + ".dat"einen normalen anzuhängen versuchst. Auch hat basic_fstream laut Standard nur einen Konstruktor für char const *, nicht für basic_string<irgendwas> und schon gar nicht für CString. Was dein Compiler daraus macht, kann ich dir ohne weitere Informationen nicht sagen.
Werden bei der Kompilation irgendwelche Warnungen ausgegeben? Das könnte man in so einem Zusammenhang fast erwarten.
-
Windows hat einen Haltepunkt in Projekt.exe ausgelöst.Dies kann auf eine Beschädigung des Heaps zurückzuführen sein, die auf ein Problem in Projekt.exe oder in einer der geladenen DLLs hinweist.
Dies kann auch darauf zurückzuführen sein, dass der Benutzer F12 drückt, während Projekt.exe den Fokus hat.
Weitere Analyseinformationen finden Sie möglicherweise im Ausgabefenster.

Aber F12 habe ich nicht gedrückt^^.
Desweiteren hält er in der Bib: tidtable.c
in der Zeile:PFLS_GETVALUE_FUNCTION flsGetValue = FLS_GETVALUE;falls das jemanden etwas sagt.
Wenn ich auf weiter drücke, kommt die Fehlermeldung:
Unbehandelte Ausnahme bei 0x77d0e653 in Projekt.exe: 0xC0000374: Ein Heap wurde beschädigt. 
-
ok, ich habe jetzt einfach mal versucht, ein normales Textdokument zu erstellen sprich
std::fstream test("test.txt", std::ios::app|std::ios::out|std::ios::in);
in der create_Files();
Die Fehlermeldung bleibt die selbe, also habe ich mir gedacht, ich versuche das ganze auch mal in Main und dort funktioniert es. In der create_Files() funktioniert es nicht.
Fehlermeldung bleibt die gleiche wie davor.Kann es sein, dass ich beim aufruf von fstream in create_Files zu viel Tiefe habe(da ich den Fehler neulich schon mal hatte) oder dass der Heap einfach voll ist und er somit einen speicherfehler bekommt ?
-
Wenn der Heap voll wäre, müsste bad_alloc geschmissen werden. Was aber sein kann (und wahrscheinlich der Fall ist), ist, dass du dir irgendwo vorher per Buffer-Overflow den Heap zerschossen hast und es deshalb bei der Anforderung weiteren Speichers durch fstream zum Fehler kommt.
-
hm, Buffer-Overflow ist doch dann, wenn ich nicht genügend Speicherplatz reserviert habe(nehme ich jetzt mal an). Müsste er mir dann aber nicht einen Error ausgeben: Zugriffsverletzung bei Adresse ... usw. ?
Bzw. das er mir gleich einen Error ausgibt.Danke schon mal für die Hilfe bisher, jetzt weis ich, schon mal ungefähr, woran liegt^^.
-
Ok, ich habe nach endlosen suchen endlich meinen Fehler gefunden. Es war ein Buffer-Overflow^^.
Vielen Dank für die Hilfe.