Fehler im Release Mode
-
Wenn ich mein Programm im Debug Modus kompiliere und starte funktioniert es absolut reibungslos. Wenn ich aber im Release Modus kompiliere und starte wird eine von mir verwendete Funktion korrekt ausgeführt. Wenn diese Funktion aber ein zweites mal ausgeführt wird bekomme ich diese Fehlermeldung:
Windows hat einen Haltepunkt in mover.exe ausgelöst.
Dies kann auf eine Beschädigung des Heaps zurückzuführen sein, die auf ein Problem in mover.exe oder in einer der geladenen DLLs hinweist.
Dies kann auch darauf zurückzuführen sein, dass der Benutzer F12 drückt, während mover.exe den Fokus hat.
Weitere Analyseinformationen finden Sie möglicherweise im Ausgabefenster.
Ausgabefenster:
+ paramvec [5]("","","","","") std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >
myvec [0]() std::vector<option *,std::allocator<option *> >Quellcode der Funktion (stark verkürtzt)
int main() { vector<std::string> parameter; parameter += "String1","String2"; makeOption(parameter); parameter.clear();//Nach dieser Anweisung wird parameter wieder befüllt und an makeOption übergeben } int makeOption(vector<std::string> paramvec) { vector<option*> myvec;//Vector von Zeigern auf Objekte der Klasse "option" for(unsigned int LaufVar_a = 0;LaufVar_a < paramvec.size();++LaufVar_a) { myvec.push_back(new option(paramvec[LaufVar_a]));//Konstruktor von option verlangt std::string als Parameter //paramvec[LaufVar_a].~basic_string();//Habe ich hinzugefügt nach dem die Fehlermeldung kam. Genützt hat es nichts. } //paramvec.~vector(); myvec[x]->setinactive(); /*Und noch weitere Methodenaufrufe*/ myvec[ri]->~option();//wird durchiteriert myvec.~vector();//Hoffe das ist richig so, ist das erste mal dass ich was mit Vectoren mache }Hoffe es kann mir Jemand helfen. Das komische ist ja, dass es im Debug Modus funktioniert und im Release Modus nicht.
Übrigens: Visual C++ 2008 Express Edition
-
myvec[ri]->~option();//wird durchiteriert myvec.~vector();//Hoffe das ist richig so, ist das erste mal dass ich was mit Vectoren macheDas ist definitv falsch.
Destruktoren sollte man nur manuell callen, wenn man sich hundertprozentig sicher ist, was man macht (wenn man placement news verwendet).
Lokale Objekte (autimatische Variablen, wie myvec eine ist) werden automaisch beim verlassen des scope zerstört.wenn du elemente aus dem vector entfernen willst, benutze remove.
Mich wundert aber stark, dass im debug modus das programm nicht abstürzt.
parameter += "String1","String2";
auch sieht diese zeile sehr komisch aus.
ih habe in keiner cpp referenz eine überladung des += operators von vektoren gefunden, webensowenig wie eine überladung des Kommaoperators bei strings.
-
Machtl schrieb:
myvec.~vector();//Hoffe das ist richig so, ist das erste mal dass ich was mit Vectoren macheNein. Wie auch die anderen expliziten Destruktoraufrufe nicht. Dazu gab es kürzlich Threads hier, such vielleicht mal...
Du solltest zuerst mit
deleteden Speicherbereich des jeweiligen Elementes (Zeigers) freigeben. Anschliessend kannst du das Element mitstd::vector::erase()löschen. Den Destruktor sollte man eigentlich nie explizit aufrufen.Vielleicht solltest du versuchen, nicht Zeiger, sondern Objekte im Vector zu speichern. Dann nimmt dieser dir nämlich die Speicherverwaltung vollständig ab und Heap Corruptions, Memory Leaks und Zugriffsverweigerungen werden seltener.
-
Ich habe #include <boost/assign/std/vector.hpp> eingebunden. den Header gibt es irgendwo zum download, ich weiss leider nicht mehr wo.
Löscht std::vector::erase den ganzen Vector oder nur ein Element? Welches Objekt muss ich der Methode übergeben. Wenn ich durchiteriere bekomme ich folgende Fehlermeldung:
Konvertierung des Parameters 1 von'int'in'std::_Vector_const_iterator<_Ty,_Alloc>'nicht möglichMuss ich mich eigentlich um den Vector der der Funktion übergeben wird nicht kümmern?
-
Hier steht alles. Du solltest diese Seite öfters benutzen, ist eine gute Referenz zu C++

-
Machtl schrieb:
Ich habe #include <boost/assign/std/vector.hpp> eingebunden. den Header gibt es irgendwo zum download, ich weiss leider nicht mehr wo.
Vermutlich von der boost-Seite.
Wenn man Codeteile ins Forum setzt die bestimmte Voraussetzungen haben, ist es in der Regel auch gut die Includes zu zeigen.Ansonsten siehe Nexus Antwort...