2010-01-21 84 views
4

假设我有一类重新分配

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._bar和酒吧指向相同的内存块,如果我离开了“删除吧;”会带来什么后果,从内存管理的角度来看?

非常感谢!

+0

正如所写,代码不能编译。 Foo没有默认的构造函数。 – 2010-01-21 16:36:58

+11

你应该击中那些在头部非常难以编写代码的人 - 引用不打算替代指针。 – 2010-01-21 16:38:45

回答

7

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

如果您需要使用指针代替这种功能。如果您只是使用指针,您的使用示例也会更简单。

3

您发布的代码不会被编译,因为引用不能被默认构建。此外,您似乎认为您正在重新设定参考,而您并不参与(请参阅here)。相反,您只是在_bar引用的任何对象上复制对象,所以其值为:

&(f.GetBar()) 

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