Soweit ich sagen kann, nichts von dem, was Sie getan haben, beinhaltet undefined Verhalten.
Es erzeugt jedoch sofort das Risiko eines Speicherlecks. Es kann schnell aufgelöst werden (da &x
auf die Adresse des durchgesickerten Speichers aufgelöst werden würde und daher gelöscht werden kann), aber wenn Sie den Gültigkeitsbereich verlassen würden, hätten Sie keine Möglichkeit, diesen Zeiger abzurufen.
Edit: auf den Punkt, wenn Sie
int& x=*new int;
x = 5;
std::cout << x << std::endl;
std::cin >> x;
std::cout << x << std::endl;
Der Code schreiben, so würde sich verhalten, als ob Sie einfach x als int x;
erklärt hatten, mit der Ausnahme, dass der Zeiger auch baumelnden würde links nach dem Programmbereich verlassen .
Sie würden ein undefiniertes Verhalten erreichen, wenn Sie versuchen würden, die nicht initialisierte Variable vor dem Zuweisen eines Werts zu lesen, aber das wäre nicht falsch, wenn x
dem Stack zugewiesen wäre.
Dies ist legitimer Code und sicher, solange Sie 'x' später mit einem Wert initialisieren, anstatt die nicht initialisierte Variable für einen bestimmten Zweck zu verwenden. Bessere Sache wäre 'int & x = * new int()', die es auch auf Nullwert initialisiert. Und natürlich müssen Sie den zugewiesenen Speicher löschen. – Arunmu
Ich glaube nicht, dass es anders ist als 'int y; int & x = y; ', was übrigens passiert, wenn du' int y; std :: cin >> y; ' – dyp