Throwing von nicht existierenden Klassen
-
Hallo
Wie kann die STD eine Exception werfen, dessen Typ nicht existiert?
MfG, EOutOfResources
EDIT: Beispielsweise kann std::bad_alloc geworfen werden, ohne das der Typ exisitiert!
-
http://www.cplusplus.com/reference/std/new/bad_alloc/
Existiert doch.
-
Wie kamst du denn darauf, dass es die Klasse nicht gibt?
-
Wenn ich keinen STD-Header include existiert std::bad_alloc nicht.
int main(void) { std::bad_alloc bar; }Gibt bei mit:
Compiler schrieb:
E2090 Qualifizer 'std' ist kein Name einer Klasse oder eines Namespace
E2379 In Anweisung fehlt ;
-
In der Datei new.cpp (oder ähnlicher Name, also wo der Sourcecode für new geschrieben wurde) existiert natürlich bad_alloc. Und dort wird die Exception mit throw geworfen. Oh, Du hast keine new.cpp? Ja, kann sein. Die wird nicht immer als Quelltext ausgeliefert, sondern liegt bei Dir wohl bereits compiliert als Teil der Bibliotheken vor.
Eine Datei, die new dann aufruft, muß bad_alloc natürlich nicht mehr inkludieren. Du müßtest nur bad_alloc inkludieren, wenn Du so eine Exception selber mit throw werfen wolltest oder eine mit catch gefangene auswerten.
-
Ausnahmen sind "relativ dynamisch". Du kannst zwei Übersetzungeunheiten haben:
void foo(); int main() { foo(); }struct x {}; void foo() { throw x(); }Das Programm kannst Du erzeugen (ÜEs kompilieren + linken). Der Typ x wird in der zweiten ÜE definiert und foo schmeißt eine Ausnahme dieses Typs. Dass diese Ausnahme in der ersten ÜE nicht gefangen wird ist eigentlich ein Fehler. Das darf gar nicht passieren. Dein Compiler ist nur so gnädig, Code einzufügen, der bei einem Abbruch von main Dir sagt, dass eine Ausnahme vom Typ ::foo geworfen und nicht gefangen wurde. Die nötige Information (runtime type information) fügt der Compiler wegen dem "throw x()" beim Übersetzen der 2. ÜE ein, was dann einfach ausgewertet wird. Um die Ausnahme korrekt fangen zu können, muss der Typ natürlich auch in der ersten ÜE bekannt sein.
Genauso wird Dein Programm gegen die Standardbibliothek gelinkt (typischerweise; der Standard beschränkt sich nicht auf den compile+link Ansatz). Irgendwo dabei sind die entsprechenden Typinformationen für std::bad_alloc.
-
EOutOfResources schrieb:
Wenn ich keinen STD-Header include existiert std::bad_alloc nicht.
int main(void) { std::bad_alloc bar; }Klar existiert
std::bad_allocdann noch, bloss ist es in deiner Übersetzungseinheit nicht deklariert.
Deswegen hat es sich aber nicht in Luft aufgelöst.
Es verschwindet ja auch nicht die ganze Welt, jedes mal wenn ich die Augen zumache
-
hustbaer schrieb:
Es verschwindet ja auch nicht die ganze Welt, jedes mal wenn ich die Augen zumache

Frag da mal einen Quantenphysiker, der zeigt dir, dass das durchaus möglich ist.
-
Deepak Chopra ist kein Quantenphysiker.
-
314159265358979 schrieb:
hustbaer schrieb:
Es verschwindet ja auch nicht die ganze Welt, jedes mal wenn ich die Augen zumache

Frag da mal einen Quantenphysiker, der zeigt dir, dass das durchaus möglich ist.
Ne, da hast du was falsch verstanden.