new*_*mer 4 c++ pointers reference
考虑到何时使用哪一个,我仍然不确定指针与引用语义.
现在,我的印象是引用本质上是指针,必须在声明时初始化,然后从那一点开始就不能指向其他任何东西.换句话说,它们就像Type* const(不Type const*),或者,它们不能被重新安置.它基本上成为该对象的"新名称".现在我听说编译器实际上并不需要使用指针来实现引用,但我认为你仍然可以用这种方式来考虑它们,关于它们的可见行为是什么.
但为什么你不能这样做:
int& foo = new int;
Run Code Online (Sandbox Code Playgroud)
我想创建一个动态内存的引用.这不编译.我收到了错误
error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int*'
Run Code Online (Sandbox Code Playgroud)
这对我来说很有意义.似乎新的操作符将给定类型的指针返回给操作系统的内存地址?动态分配给我.
那么如何创建动态内存的"引用"呢?
编辑:可以理解为精确解释C++中引用和指针之间差异的资源的链接.
new 返回指向已分配内存的指针,因此需要捕获指针中的返回值.
分配完成后,您可以创建对指针的引用.
int *ptr = new int;
int* &ref = ptr;
Run Code Online (Sandbox Code Playgroud)
然后在使用后删除它:
delete ref;
Run Code Online (Sandbox Code Playgroud)
或者更简单地说,
int &ref = *(new int);
Run Code Online (Sandbox Code Playgroud)
使用后将其删除为:
delete &ref;
Run Code Online (Sandbox Code Playgroud)
你可以得到这样的参考:
int& foo = *(new int);
Run Code Online (Sandbox Code Playgroud)
在一般情况下,从获得T*到T&您使用*为"解引用"指针.
然而,这首先不是一个好主意.您通常使用指针来存储堆分配对象的地址.
参考文献是语法糖.它们允许用点运算符而不是箭头访问对象.
您是否使用指针或引用的选择是语义的.当您通过引用方法传递对象或从方法返回引用时,您说:"这是我的对象,您可以使用它,但我拥有它(它可能在堆栈或堆上. )"接下来,其他答案在这里建议语法delete &foo;可能在技术上工作,但闻起来很糟糕; 如果您有对象的引用,那么您不应该删除它.你不拥有它,最重要的是,因为你不能重置引用,你最终会提到释放内存,这是一件坏事.
现在,如果你已经在堆上分配了一个对象(称为'new'来创建它),那么你就拥有了它,并负责稍后清理它,所以你需要保持指向它的指针.为什么?因此,您可以在以后安全地删除它并使指针无效.
因此,除了使用点而不是箭头的机械差异之外,指针和引用之间的差异在于通过引用方法来指示关于应如何使用对象的方法.通过调用new直接初始化引用是无稽之谈,即使可能.