return Anweisung optional?
Verfasst: Do Sep 11, 2008 6:46 pm
Hallo!
Bitte seht euch folgenden Code an:
Wenn ihr mal etwas genauer hinseht werdet ihr bemerken, dass da etwas fehlt, und zwar es ist die "return msg;" anweisung in der Funktion getMessage(). "Das ist doch klar ein Fehler" werdet ihr denken. Die funktion getMessage() deklariert, dass sie ein Objekt des Typs std::string zurückgibt, aber das tut sie offensichtlich nicht. Die logische schlussfolgerung wäre, dass der Compiler einen fehler ausspuckt, so in die richtung von "Missing return statement in function getMessage()" (oder so ähnlich).
Tja, wenn man den Code durch den Compiler schickt, gibt erstmal ne Überraschung: der Compiler gibt keine Fehler aus, und kompiliert das Programm.
Wenn man das Programm aufruft gibts dann eine Endlosschleife (zumindest bei mir, bei vielen gibts wahrscheinlich einen Segmentation Fault.), und es lässt sich nur durch CTRL- C beenden.
Kann mir jemand sagen was da los ist? Offensichtlich holt sich der Konstruktur von std::string (erste Zeile in main() ) fröhlich seinen String vom Stack ab, nachdem er den Aufruf nach getMessage() getätigt hat. getMessage() hat dort aber nichts abgelegt, also ist der Inhalt dieses Strings undefiniert, und so verursacht auch der Konstruktoraufruf undefiniertes verhalten.
Aber wieso in aller Welt gibt es da keinen Fehler? Ist das ein Compilerproblem? Irgendwie entzieht sich das meiner Weisheit.
Verwendete Compiler: gcc-4.3, gcc-4.4 aus SVN, beide male das gleiche ergebnis.
Ich bitte um Hilfe, mein Welt (C++) Bild wieder zurechtzurücken.
Bitte seht euch folgenden Code an:
Code: Alles auswählen
#include <iostream>
#include <string>
std::string getMessage()
{
std::string msg("Is there anybody out there?");
}
int main()
{
std::string message(getMessage());
std::cout<<message<<'\n';
return 0;
}
Tja, wenn man den Code durch den Compiler schickt, gibt erstmal ne Überraschung: der Compiler gibt keine Fehler aus, und kompiliert das Programm.
Wenn man das Programm aufruft gibts dann eine Endlosschleife (zumindest bei mir, bei vielen gibts wahrscheinlich einen Segmentation Fault.), und es lässt sich nur durch CTRL- C beenden.
Kann mir jemand sagen was da los ist? Offensichtlich holt sich der Konstruktur von std::string (erste Zeile in main() ) fröhlich seinen String vom Stack ab, nachdem er den Aufruf nach getMessage() getätigt hat. getMessage() hat dort aber nichts abgelegt, also ist der Inhalt dieses Strings undefiniert, und so verursacht auch der Konstruktoraufruf undefiniertes verhalten.
Aber wieso in aller Welt gibt es da keinen Fehler? Ist das ein Compilerproblem? Irgendwie entzieht sich das meiner Weisheit.
Verwendete Compiler: gcc-4.3, gcc-4.4 aus SVN, beide male das gleiche ergebnis.
Ich bitte um Hilfe, mein Welt (C++) Bild wieder zurechtzurücken.