重新分配参考

时间:2010-01-21 16:30:59

标签: c++ memory-leaks reference

假设我有一个班级

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指向相同的内存块,如果我省略“删除栏”,从内存管理的角度来看会有什么后果?

非常感谢!

2 个答案:

答案 0 :(得分:8)

引用cannot被“重置”,setBar()只是将bar的内容复制到_bar引用的对象。

如果您需要这样的功能,请使用指针。如果你只是使用指针,你的使用示例也会简单得多。

答案 1 :(得分:3)

您发布的代码无法编译,因为引用不能默认构造。此外,您似乎认为您正在重新引用一个您不是的引用(请参阅here)。相反,您只是在_bar引用的任何内容上复制对象,因此值为:

&(f.GetBar())

永远不会改变。你不应该删除_bar,因为你从来没有拥有它(或者甚至真的知道它是动态分配的)。那应该是“新手”的人的责任。