1

为什么不使用以下内容:

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

4 回答 4

3

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

delete &foo;

这是一个坏主意。

于 2013-05-11T00:37:45.410 回答
2

您可以结合智能指针执行此操作。

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

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

于 2013-05-11T00:47:26.113 回答
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

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

于 2013-05-11T01:01:18.093 回答
0

回复:“必须尽可能使用引用”?这个(坏的)建议从何而来?

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

没有指针,没有引用,没有免费存储,没有delete.

但是当你从空闲存储区进行分配时,你会得到一个指向数据对象的指针。不要把它变成参考,除非你绝对必须这样做,即使那样,也不要这样做。

于 2013-05-11T13:19:11.887 回答