Ссылки не являются объектами. У них нет деструкторов. У них есть жизни. У объектов тоже есть время жизни, как и у любого другого типа в C ++.
Разница в том, что, когда заканчивается время жизни объекта, вызывается его деструктор. Но когда время жизни любого другого типа заканчивается, их ресурсы просто освобождаются.
В случае ссылки, ресурс, который они содержат, является адресом памяти, указывающим на другое значение. Не само значение. Поэтому, когда он освобождается, значение остается прежним. Адрес сохраненной памяти - это то, что высвобождается, а не значение.
Когда вы используете new / delete, вы вручную указываете, когда начинается время жизни (для нового) и когда оно заканчивается (при удалении).
В вашем примере ваши времена жизни X и Y будут следующими:
struct A{
int &a;
A(int&i): a(i){}
}
void f(){
int* i = new int; // ----------------------------------|X
A* a = new A(i); // -------------------|Y |X
delete a; // is i been destroyed? // --|Y |X
} // |X
// |X...
Как видите, время жизни X продолжается вечно, поскольку вы не удалили его вручную но вы создали это с новым. Это означает, что значение, которое хранится в i
, все равно будет действительным после строки, в которой вы удаляете a
.
PD: Вместо этого вы должны были написать new A(*i)
, иначе вы получите компилятор ошибка.