Переназначение ссылки

Предположим, что у меня есть класс

class Foo
{
  public:
    ~Foo() { delete &_bar; }
    void SetBar(const Bar& bar)
    {
      _bar = bar;
    }
    const Bar& GetBar() { return _bar; }
  private:
    Bar& _bar;
}

И мое использование этого класса следующим образом (предположите, что Панель имеет рабочего конструктора копии),

Foo f;
f.SetBar(*(new Bar));
const Bar* bar = &(f.GetBar());
f.SetBar(*(new Bar(bar)));
delete bar;

У меня есть ситуация, подобная этому (в коде, который я не написал), и когда я отлаживаю в наборе точки останова на, "удаляют панель"; строка, я вижу это

&f._bar == bar

Мой вопрос - это: Почему делают &f. _ панель и панель указывают на тот же блок памяти, и если я не учитываю, "удаляют панель"; каковы последствия с точки зрения управления памятью?

Большое спасибо!

5
задан Jesse Stimpson 21 January 2010 в 16:30
поделиться

2 ответа

Ссылки Быть «переправлено», SetBar () просто копирует содержимое панели на объект, на который ссылается _bar .

Если вам нужна такая функциональность, используйте указатели. Также ваш пример использования будет намного проще, если бы вы просто используете указатели.

8
ответ дан 13 December 2019 в 19:27
поделиться

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

&(f.GetBar())

никогда не меняется. Вы не должны удалять _bar, потому что вы никогда не владели этим (или даже действительно знали, что это динамически выделено), чтобы начать с. Это должно быть ответственностью того, кто «вновь» это.

3
ответ дан 13 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: