Переназначение ссылки - PullRequest
5 голосов
/ 21 января 2010

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

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

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

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

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

&f._bar == bar

У меня такой вопрос: почему & f._bar и bar указывают на один и тот же блок памяти, и если я опускаю «delete bar;», каковы последствия с точки зрения управления памятью?

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

Ответы [ 2 ]

8 голосов
/ 21 января 2010

Ссылки не могут быть "переустановлены" , setBar() просто копирует содержимое bar в объект, указанный в _bar.

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

3 голосов
/ 21 января 2010

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

&(f.GetBar())

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

...