O ile wiem, żadne z twoich działań nie dotyczy niezdefiniowanego zachowania.
Powoduje to jednak natychmiastowe ryzyko wycieku pamięci. Może być szybko rozwiązany (ponieważ &x
rozwiąże adres adresu wyciekanej pamięci, a zatem może zostać usunięty), ale jeśli opuścisz zakres, nie będziesz w stanie uzyskać tego wskaźnika.
Edycja: do rzeczy, jeśli były, aby napisać
int& x=*new int;
x = 5;
std::cout << x << std::endl;
std::cin >> x;
std::cout << x << std::endl;
kod będzie zachowywać się tak, jakby po prostu oświadczył x jako int x;
, oprócz tego, że wskaźnik będzie również pozostawić zwisające po program zakończył zakresu .
Osiągniesz niezdefiniowane zachowanie, jeśli spróbujesz odczytać niezainicjowaną zmienną przed przypisaniem jej wartości, ale nie byłoby to nieprawdą, gdyby x
było przydzielone w stosie.
To jest poprawny kod i jest bezpieczny, dopóki inicjalizujesz 'x' później z pewną wartością, zamiast używać niezainicjowanej zmiennej do jakiegoś celu. Lepszą rzeczą byłoby 'int & x = * new int()', która również inicjuje ją do wartości zerowej. I oczywiście musisz usunąć przydzieloną pamięć. – Arunmu
Nie sądzę, żeby to było coś innego niż 'int y; int & x = y; ', co dzieje się po drodze, gdy robisz' int y; std :: cin >> y; ' – dyp