6

除了关于何时使用 which 的所有考虑之外,我仍然不确定指针与引用语义。

现在,我的印象是引用本质上是在声明它们时必须初始化的指针,然后从那时起不能指向其他任何东西。换句话说,它们是一个Type* const(不是Type const*),或者,它们不能被重新安装。它本质上成为该对象的“新名称”。现在我听说引用实际上不需要由编译器使用指针来实现,但我的印象是你仍然可以这样想它们,关于它们的可见行为将是什么。

但是为什么你不能做这样的事情:

int& foo = new int;

我想创建对动态内存的引用。这不编译。我得到错误

error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int*'

这对我来说很有意义。似乎 new 运算符将给定类型的指针返回到操作系统的内存地址?为我动态分配。

那么如何创建对动态内存的“引用”呢?

编辑:将不胜感激提供精确解释 C++ 中引用和指针之间差异的资源链接。

4

3 回答 3

13

new返回一个指向已分配内存的指针,因此您需要在指针中捕获返回值。

您可以在分配完成后创建对指针的引用。

int *ptr = new int;
int* &ref = ptr;

然后在使用后将其删除:

delete ref;

或者更简单地说,

int &ref = *(new int);

使用后删除它:

delete &ref;
于 2012-04-05T06:28:08.653 回答
5

你可以得到这样的参考:

int& foo = *(new int);

通常,要从您那里获得T*使用T&*取消引用”指针。

然而,这首先不是一个好主意。您通常使用指针来存储堆分配对象的地址。

于 2012-04-05T06:28:33.973 回答
5

引用是语法糖。它们允许使用点运算符而不是箭头来访问对象。

您选择使用指针还是引用是语义的。当您通过对方法的引用传递对象或从方法返回引用时,您是在说:“这是我的对象,您可以使用它,但我拥有它(它可能在堆栈或堆上。 )" 因此,此处建议语法的其他答案在delete &foo;技术上可能有效,但闻起来很糟糕;如果你有一个对象的引用,那么你不应该删除它。您不拥有它,最重要的是,由于您无法重置引用,因此您最终会获得对已释放内存的引用,这是一件坏事

现在,如果您在堆上分配了一个对象(称为“新”来创建它),那么您确实拥有它,并负责稍后清理它,因此您需要持有指向它的指针。为什么?因此,您可以稍后安全地删除它并将指针设为空。

因此,除了使用点而不是箭头的机械差异之外,指针和引用之间的区别在于,通过引用传递给方法,您可以指示应该如何使用对象。即使可能,通过调用 new 直接初始化引用也是无稽之谈。

于 2012-04-05T06:47:57.927 回答