Безопасно ли устанавливать ссылки следующим образом

0

Может ли кто-нибудь сказать мне, является ли это безопасным и определенным:


class RefClass
{
public:
    RefClass(int i) { this->i = i; }
    int& GetRef() { return i; }
private:
    int i; 
};


RefClass rc(10);

int* refp;

{
    refp = &rc.GetRef();
}

*refp = 20;

В частности, я интересуюсь временем жизни возвращенной ссылки во вложенной области и может ли она ссылаться в этой области, а затем будет разыменоваться как lvalue после того, как эта область исчезла.

Этот код компилируется и работает как ожидалось в VS2012, но это не значит, что он будет в следующей версии, поэтому я пытаюсь найти окончательный ответ.

Теги:
reference
memory-management
visual-studio-2012

2 ответа

1
Лучший ответ

Да, это прекрасно.

Возвращенная ссылка является временной, продолжающейся до конца оператора, содержащего вызов функции. Он использовал в течение своей жизни, чтобы установить refp чтобы указать на его цель, rc.i После этого не нужно было разыгрывать указатель.

Единственная опасность заключается в том, что объект может быть уничтожен, оставив указатель висящим:

int* refp;

{
    RefClass rc(10);
    refp = &rc.GetRef();
} // rc is destroyed here

*refp = 20; // BOOM!!!
1

Да, все в порядке. У вас возникнут проблемы в следующем случае:

int* refp;

{
    RefClass rc(10);
    refp = &rc.GetRef();
}

*refp = 20;
  • 0
    Ваш ответ также верен, но вы должны отдать должное другому ответу для более подробного объяснения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню