Iteratoren dereferenzieren und Exception?
-
Hi! Ich habe mal den Versuch gemacht, und einen Iterator der auf end zeigt, zu dereferenzieren. Dabei wurde eine Exception geworfen, die anscheinend nicht vom Typ std::exception ist. Ich kann sie nur mit catch(...) abfangen. Weiß jemand was der Standard dazu sagt?
Ich benutze übrigens MSVC7.1.
EDIT: Ich muß mich korrigieren. Mit catch(...) bekomme ich zwar von Windows kein Fehlermeldungsfenster, aber mein Programm läuft trotzdem nicht weiter. Komisches Verhalten...
-
welche runtime hattest du?!
-
Im Release. Mit der Debug-Runtime kommt nur "Müll" und keine Exception.
-
Artchi schrieb:
Hi! Ich habe mal den Versuch gemacht, und einen Iterator der auf end zeigt, zu dereferenzieren. Dabei wurde eine Exception geworfen, die anscheinend nicht vom Typ std::exception ist. Ich kann sie nur mit catch(...) abfangen. Weiß jemand was der Standard dazu sagt?
Das Dereferenzieren eines ungültigen Iterators führt laut Standard zu undefiniertem Verhalten. Der Standard kann dir hier also nicht helfen. Ich verschiebe dich mal ins VC-Forum.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Kannst Du mal den genauen Code posten?
-
Hem, also irgendwie scheint der Compiler schlau zu sein. Aber nur ein wenig.
Bsp.:
using namespace std; vector<string> namen; namen.push_back("Hans"); typedef vector<string>::iterator iterator; for(iterator iter = namen.begin(); ; iter++) { cout << *iter << endl; }
Man beachte die for-Bedingung! In diesem Fall wird eine Exception geschmissen. Mein ZoneAlarm meldet jedenfalls einen ungewöhnlichen Zugriff auf dwwin.exe. Danach folgt eine Fehlermeldung von Windows.
Hier folgt ein Bsp. (welches ich erst jetzt ausprobiert habe) und komischerweise keine Exception wirft. Auf der Konsole erscheint allerdings nichts (auch kein Müll) und auch kein "ende".
using namespace std; vector<string> namen; namen.push_back("Hans"); vector<string>::iterator iter = namen.end(); cout << *iter; cout << "ende";
Merkwürdig...
Artchi
PS: kompiliert habe ich mit "cl.exe /EHsc test.cpp" ohne weitere Optionen.
-
Also bei mir kommt ein Assert:
#include <tchar.h> #include <vector> #include <string> #include <iostream> using namespace std; int _tmain() { vector<string> namen; namen.push_back("Hans"); vector<string>::iterator iter = namen.end(); cout << *iter; cout << "ende"; }
Zuerst:
vector iterator not dereferencable
dann, nach drücken von "Ignore":
Standard C++ Libraries Out of Range
(jeweils VC2005)
Wenn Du das iterator-Debugging ausschaltest =>
#define _HAS_ITERATOR_DEBUGGING 0 #include <tchar.h> #include <vector> #include <string> #include <iostream> using namespace std; int _tmain() { vector<string> namen; namen.push_back("Hans"); vector<string>::iterator iter = namen.end(); cout << *iter; cout << "ende"; }
kommt eine etwas kryptischere Assert-Meldung:
_Myptr < ((_Myvec *)(this->_Mycont))->_Mylast
Also wie gesagt: Alles normal, denn es ist nicht erlaubt...
-
PS: Das das "ende" bei VC7.1 nicht ausgegeben wird hängt vermutlich daran, dass Du kein "flush" gemacht hast