2013-06-11 20 views
9

Ich habe eine Funktion geschrieben, die einen Verweis auf ein lokales Objekt zurückgibt.Funktion, die einen Verweis auf ein lokales Objekt zurückgibt

Fraction& operator*(Fraction& lhs, Fraction& rhs) 
{ 
    Fraction res(lhs.num*rhs.num,lhs.den*rhs.den); 
    return res; 
} 

Nach Funktion kehrt die res wird Objekt zerstört und Empfang Objekt Ex-Fraction-Objekt, die zu undefiniertem Verhalten weiterer Verwendung verweisen. Jeder, der diese Funktion verwenden wird, wird ein Problem haben.

Warum kann der Compiler diese Art von Situation nicht als Kompilierzeitfehler erkennen?

+13

Im Allgemeinen kann es - g ++ etwas wie 'Warnung ausgeben: Verweis auf lokale Variable' x 'zurückgegeben [standardmäßig aktiviert]'. Dies hängt möglicherweise vom verwendeten Compiler und/oder von den verwendeten Compiler-Switches ab. –

+2

das ist, was Warnungen sind, um alle Warnungen als Fehler zu behandeln. – yngccc

+0

Hinweis Sie können durch konstanten Bezug zurückgeben und es wird in Ordnung sein – dchhetri

Antwort

19

Die meisten Compiler zeigen eine Warnung, wenn Sie das tun. Sie sollten Warnungen immer mit einer Option wie GCC -Wall aktivieren.

Warum ein Fehler vom Standard nicht benötigt wird, liegt daran, dass eine Funktion mit Ablaufsteuerung es schwierig macht festzustellen, ob der Rückgabewert auf einen lokalen Verweis verweist oder nicht. (Undefiniertes Verhalten tritt nur auf, wenn der Rückgabewert vom Aufrufer verwendet wird.)

+0

Können Sie ein Beispiel für eine solche "schwer zu sagen" -Situation geben, ohne Zeigerarithmetik/-erstellung? – Elazar

+8

@Elazar Sicher, 'return fn (local_var);' Die Funktion gibt möglicherweise einen Verweis auf ihr Argument zurück, das eine lokale Variable ist. Oder 't & ref = Flagge? local: global; 'und später' return ref; '. Dann muss der Compiler beweisen, dass die Funktion nur dann zurückkehrt, wenn "Flag" "falsch" ist. – Potatoswatter

+0

Ich denke, der Compiler sollte eine Warnung für die 'return ref' ausgeben, die auf den bedingten Ausdruck zeigt. Dies ist eine "Kann" -Analyse. 'Return fn (local)' ist eine andere Geschichte, stimme ich zu. – Elazar

Verwandte Themen