在构造动态对象时解除引用

时间:2013-05-11 00:34:05

标签: c++ pointers reference

为什么不使用以下内容:

struct Foo
{
    int x;
};

int main()
{
    Foo &foo = *new Foo();
    foo.x = 7;
    std::cout << foo.x << std::endl;
    delete &foo;
}

毕竟,必须尽可能使用引用,并且通过这种方法,一旦我们最初取消引用,我们就不必担心再次忘记它。有什么缺点?

编辑:

我知道operator ->,忘记了我的意思

int &n = *new int;
n = 7;
int *m = new int;
*m = 7; //here you can forget it

4 个答案:

答案 0 :(得分:3)

你会有内存泄漏。你必须在函数结束时做这样的事情:

delete &foo;

这是一个坏主意。

答案 1 :(得分:2)

您可以结合使用智能指针进行此操作。

std::unique_ptr<Foo> p(new Foo);
Foo &foo = *p;
//...

然后,在范围结束时将为您正确删除内存。

答案 2 :(得分:1)

这种方法没有明显的缺点。但是,如果必须使用动态分配参考,即T& t = *new T;,则应重新考虑设计 为什么?因为,

  

在声明时必须初始化引用。”

这意味着,您无法执行T& t;,然后为其分配一些内存 如下声明:

T& t = *new T;  // (1) costly heap allocation (2) exception handling (3) need cleaning

变得轻而易举地替代:

T t;  // (1) cheaper auto allocation (2) no exception (2) no need to clean

因此,即使您可以动态分配引用,也几乎不需要它们。

答案 3 :(得分:0)

回复:“必须尽可能使用参考”?这个(坏的)建议来自哪里?

Foo foo;
foo.x = 7;
std::cout << foo.x << std::endl;

没有指针,没有引用,没有免费商店,没有delete

但是当你从免费商店分配时,你会得到一个指向数据对象的指针。除非你绝对必须这样做,否则不要把它变成参考。即使这样,也不要这样做。