Dieser Code-Ausschnitt:
int& func1()
{
int i;
i = 1;
return i;
}
funktioniert nicht, da Sie einen Alias (eine Referenz) an ein Objekt zurückgeben, dessen Lebensdauer auf den Umfang des Funktionsaufrufs beschränkt ist. Das heißt, sobald func1()zurückgegeben wird, int istirbt, wird die von der Funktion zurückgegebene Referenz wertlos, da sie jetzt auf ein Objekt verweist, das nicht existiert.
int main()
{
int& p = func1();
/* p is garbage */
}
Die zweite Version funktioniert, da die Variable im freien Speicher zugeordnet ist, der nicht an die Lebensdauer des Funktionsaufrufs gebunden ist. Sie sind jedoch für deletedie Zuweisung verantwortlich int.
int* func2()
{
int* p;
p = new int;
*p = 1;
return p;
}
int main()
{
int* p = func2();
/* pointee still exists */
delete p; // get rid of it
}
Normalerweise wird der Zeiger in eine RAII- Klasse und / oder eine Factory-Funktion eingeschlossen, damit Sie ihn nicht deleteselbst benötigen .
In beiden Fällen können Sie einfach den Wert selbst zurückgeben (obwohl mir klar ist, dass das von Ihnen angegebene Beispiel wahrscheinlich erfunden wurde):
int func3()
{
return 1;
}
int main()
{
int v = func3();
// do whatever you want with the returned value
}
Beachten Sie, dass es vollkommen in Ordnung ist, große Objekte auf dieselbe Weise zurückzugeben, wie func3()primitive Werte zurückgegeben werden, da heutzutage fast jeder Compiler eine Form der Rückgabewertoptimierung implementiert :
class big_object
{
public:
big_object(/* constructor arguments */);
~big_object();
big_object(const big_object& rhs);
big_object& operator=(const big_object& rhs);
/* public methods */
private:
/* data members */
};
big_object func4()
{
return big_object(/* constructor arguments */);
}
int main()
{
// no copy is actually made, if your compiler supports RVO
big_object o = func4();
}
Interessanterweise ist das Binden eines Temporärs an eine const- Referenz in C ++ völlig legal .
int main()
{
// This works! The returned temporary will last as long as the reference exists
const big_object& o = func4();
// This does *not* work! It's not legal C++ because reference is not const.
// big_object& o = func4();
}
int& i = * new int;